帮助中心
Linux如何使用Grep命令进行搜索排除



Grep是一个强大的命令行工具,用于搜索一个或多个输入文件中与正则表达式相匹配的行,并将每个匹配行写入标准输出。
在这篇文章中,我们将告诉你如何在使用grep搜索时排除一个或多个单词、模式或目录。

排除字词和模式


要想只显示与搜索模式不匹配的行,可以使用-v(或-invert-match)选项。
例如,要打印不包含字符串nologin的行,你可以使用。

$ grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
feb:1000:1000:feb:/home/feb:/bin/bash

-w选项告诉grep只返回那些指定的字符串是整个单词的行(由非单词字符括起来)。

默认情况下,grep是大小写敏感的。这意味着大写字母和小写字母被当作不同的字符处理。要在搜索时忽略大小写,请用-i选项调用grep。

如果搜索字符串包括空格,你需要用单引号或双引号将其括起来。

要指定两个或多个搜索模式,使用-e选项。

$ grep -wv -e nologin -e bash /etc/passwd

你可以根据需要多次使用-e选项。

另一个排除多个搜索模式的选项是使用OR操作符|连接这些模式。

下面的例子打印了不包含nologin或bash字符串的行。

$ grep -wv 'nologin\|bash' /etc/passwd

GNU grep支持三种正则表达式语法:Basic, Extended, 和Perl-compatible。默认情况下,grep将模式解释为基本正则表达式,其中元字符如|失去了其特殊含义,你必须使用其反斜线版本。

如果你使用扩展的正则表达式选项-E,那么运算符|不应该被转义,如下所示。

$ grep -Ewv 'nologin|bash' /etc/passwd

你可以指定不同的可能匹配,可以是字面字符串或表达式集。在下面的例子中,排除了字符串games出现在行的最开头的行。

$ grep -v "^games" file.txt

一个命令的输出可以通过管道用grep进行过滤,只有与给定模式相匹配的行才会被打印在终端。

例如,要打印出系统中所有正在运行的进程,除了以用户 "root "身份运行的进程外,你可以过滤ps命令的输出。

$ ps -ef | grep -wv root


排除目录和文件


有时在使用-r或-R选项执行递归搜索时,你可能想从搜索结果中排除特定的目录。

-r或-R选项的主要区别是,当grep用大写的R调用时,它将遵循所有的符号链接
要从搜索中排除一个目录,使用--exclud-dir选项。被排除的目录的路径是相对于搜索目录的。

下面是一个例子,显示了如何在/etc目录下的所有文件中搜索字符串linuxize,排除了/etc/pki目录。

$ grep -R --exclude-dir=pki linuxize /etc

要排除多个目录,请将被排除的目录用大括号括起来,并用逗号分隔,不要有空格。

例如,要在排除proc、boot和sys目录的Linux系统中找到包含 "gnu "字符串的文件,你需要运行。

$ grep -r --exclude-dir={proc,boot,sys} gnu /

当使用通配符匹配时,你可以排除那些基本名称与 --exclude 选项中指定的 GLOB 相匹配的文件。

在下面的例子中,我们在当前工作目录中搜索字符串linuxize的所有文件,排除以.png和.jpg目录结束的文件。

$ grep -rl --exclude=*.{png,jpg} feb*


结论


grep命令允许你在搜索文件时排除模式和目录。

文章相关标签: Grep命令
购物车