关于正则表达式:如何用grep排除一个单词?

How can I exclude one word with grep?

我需要这样的东西:

1
grep ^"unwanted_word"XXXXXXXX


您也可以使用grep的-v(对于--invert-match)选项执行此操作:

1
grep -v"unwanted_word" file | grep XXXXXXXX

grep -v"unwanted_word" file将过滤具有unwanted_word的行,而grep XXXXXXXX将仅列出具有模式XXXXXXXX的行。

编辑:

从您的评论看起来您想要列出没有unwanted_word的所有行。在这种情况下,您只需要:

1
grep -v 'unwanted_word' file


我将这个问题理解为"如何匹配一个单词但排除另一个单词",其中一个解决方案是两个greps系列:第一个grep找到想要的"word1",第二个grep排除"word2":

1
grep"word1" | grep -v"word2"

在我的情况下:我需要区分grep的"word"选项不会做的"plot"和"#plot"("#"不是字母数字)。

希望这可以帮助。


如果grep支持使用-P选项的Perl正则表达式,则可以执行(如果使用bash;如果tcsh,则需要转义!):

1
grep -P '(?!.*unwanted_word)keyword' file

演示:

1
2
3
4
5
6
7
$ cat file
foo1
foo2
foo3
foo4
bar
baz

现在让我们列出除foo3之外的所有foo

1
2
3
4
5
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$


正确的解决方案是使用grep -v"word" file,其awk等效:

1
awk '!/word/' file

但是,如果碰巧有一个更复杂的情况,例如,XXX出现并且YYY不显示,则awk会派上用场而不是管道好几个grep

1
2
3
4
awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

你甚至可以说一些更复杂的东西。例如:我希望这些行包含XXXYYY,但不包含ZZZ

1
awk '(/XXX/ || /YYY/) && !/ZZZ/' file

等等


使用grep -v反转匹配:

1
grep -v"unwanted word" file pattern

grep提供'-v'或'--invert-match'选项来选择不匹配的行。

例如

1
grep -v 'unwanted_pattern' file_name

这将输出文件file_name中的所有行,该行没有'unwanted_pa??ttern'。

如果要在文件夹内的多个文件中搜索模式,可以使用递归搜索选项,如下所示

1
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

这里grep将尝试列出当前目录中所有文件中'wanted_pa??ttern'的所有匹配项,并将其传递给第二个grep以过滤掉'unwanted_pa??ttern'。
'|' - pipe将告诉shell将左程序的标准输出(grep -r'want_pattern'*)连接到正确程序的标准输入(grep -v'wiscory_pattern')。


-v选项将显示与模式不匹配的所有行。

1
grep -v ^unwanted_word

我有一堆文件的目录。我想找到所有不包含字符串"speedup"的文件,所以我成功使用了以下命令:

1
grep -iL speedup *