grep
是一个强大的命令行工具,用于在一个或多个输入文件中搜索与正则表达式匹配的行并将每个匹配的行写入到标准输出。
在本教程中,我们将向您展示如何使用grep
对输出进行过滤,排除 。这其中包括排除不匹配的行,排除目录和文件等。
排除不匹配的行
要仅打印与搜索模式不匹配的行,请使用-v
( 或--invert-match
) 选项。例如,要打印不包含nologin
行:
grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bashgit:x:994:994:git daemon user:/:/usr/bin/git-shell
myfreax:x:1000:1000:myfreax:/home/myfreax:/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
GNUgrep
支持三种正则表达式语法,Basic、Extended和Perl-compatible。默认情况下,grep
将模式解释为Basic正则表达式,其中元字符(例如)|
失去其特殊含义(在Linux中|
是管道pipe),您使用它们的时必须使用反斜杠\进行转义。
如果要使用扩展正则表达式-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
选项之间的主要区别在于,当使用大写字母R
调用grep时,它将遵循所有符号链接
要从搜索中排除目录,请使用--exclude-dir
选项。排除目录的路径是相对于搜索的目录。这是一个示例,显示如何在/etc
目录中搜索包含字符串myfreax
的文件,不包括/etc/pki
目录:
grep -R --exclude-dir=pki myfreax /etc
要排除多个目录,请将排除的目录括在大括号中,并用逗号分隔,不要有空格。例如,要在你的Linux系统查找包含字符串“GNU”的文件,并且排除proc
,boot
和sys
目录:
grep -r --exclude-dir={proc,boot,sys} gnu /
使用通配符匹配时,您可以使用--exclude
选项并指定的GLOB来排除不需要结果。在下面的示例中,我们在当前工作目录中搜索包含字符串myfreax
的文件,不包括以.png
和.jpg
目录结尾的文件:
grep -rl --exclude=*.{png,jpg} myfreax *
结论
grep
命令允许您在搜索文件时排除模式和目录。如果您有任何问题或反馈,请随时发表评论。
还没有评论,来说两句吧...