在本文中,我们将向您展示在使用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
ywnz:x:1000:1000:ywnz:/home/ywnz:/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兼容。默认情况下,grep将模式解释为基本的正则表达式,其中的元字符(例如|)失去其特殊含义,您必须使用其反斜线版本。
如果使用扩展的正则表达式选项-E,那么运算符|不应逃脱,如下所示:
grep -Ewv 'nologin|bash' /etc/passwd
您可以指定不同的可能匹配项,这些匹配项可以是文字字符串或表达式集。在下面的示例中,排除了字符串游戏在行的开始处发生的行:
grep -v "^games" file.txt
可以使用grep通过管道过滤命令的输出,并且只有与给定模式匹配的行才会打印在终端上。
例如,要打印出系统上所有正在运行的进程(以用户“root”身份运行的进程除外),可以过滤ps命令的输出:
ps -ef | grep -wv root
排除目录和文件
有时,当使用-r或-R选项执行递归搜索时,您可能希望从搜索结果中排除特定目录。
-r或-R选项之间的主要区别在于,当使用大写R调用grep时,它将跟随所有符号链接。
要从搜索中排除目录,请使用--exclude-dir选项。排除目录的路径是相对于搜索目录的。
这是一个示例,显示了如何在/etc内的所有文件(不包括/etc/pki目录)中搜索字符串ywnz:
grep -R --exclude-dir=pki ywnz /etc
要排除多个目录,请将排除的目录括在大括号中,并用逗号分隔,两个空格之间不能有空格。
例如,要在Linux系统中查找包含字符串“gnu”的文件(不包括proc、boot和sys目录),请运行:
grep -r --exclude-dir={proc,boot,sys} gnu /
使用通配符匹配时,可以排除基本名称与--exclude选项中指定的GLOB匹配的文件。
在下面的示例中,我们正在搜索当前工作目录中的所有文件以查找字符串ywnz,但不包括以.png和.jpg目录结尾的文件:
grep -rl --exclude=*.{png,jpg} ywnz *
结论
在Linux系统中使用grep命令可以在搜索文件时排除模式和目录,实现起来也简单。
相关主题