Grep是一个强大的命令行工具,用于搜索一个或多个输入文件中与正则表达式相匹配的行,并将每个匹配行写入标准输出。
在这篇文章中,我们将告诉你如何在使用grep搜索时排除一个或多个单词、模式或目录。
$ 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
$ 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*
上一条: 什么是云服务器503服务不可用错误