如何在Grep中进行排除

评论 0 浏览 0 2021-05-18

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操作符|连接这些模式。

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

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 "字符串的文件,不包括procbootsys目录,你将会运行。

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

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

在下面的例子中,我们正在搜索当前工作目录中的所有文件,以查找字符串linuxize,不包括以.png.jpg目录结尾的文件。

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

总结

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

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-03-27
0 个评论
标签