如何在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
linuxize:x:1000:1000:linuxize:/home/linuxize:/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
支持三种正则表达式语法,即基本语法、扩展语法和 Perl 兼容语法。默认情况下,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
调用时,它将跟踪所有符号性链接。
要从搜索中排除一个目录,使用--exclude-dir
选项。被排除的目录的路径是相对于搜索目录的。
下面是一个例子,显示了如何在/etc
内的所有文件中搜索字符串linuxize
,而不包括/etc/pki
目录。
grep -R --exclude-dir=pki linuxize /etc
要排除多个目录,请将被排除的目录用大括号括起来,并用逗号隔开,不要有空格。
例如,要在你的Linux系统中找到包含 "gnu "字符串的文件,不包括proc
、boot
和sys
目录,你将会运行。
grep -r --exclude-dir={proc,boot,sys} gnu /
当使用通配符匹配时,你可以排除那些基本名称与--exclude
选项中指定的GLOB相匹配的文件。
在下面的例子中,我们正在搜索当前工作目录中的所有文件,以查找字符串linuxize
,不包括以.png
和.jpg
目录结尾的文件。
grep -rl --exclude=*.{png,jpg} linuxize *
总结
在搜索文件时,grep
命令允许你排除模式和目录。
如果你有任何问题或反馈意见,请随时留言。