如何使用grep排除一个单词?


Answers:


801

您可以使用grep的-v(for --invert-match)选项来做到这一点:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" file将过滤具有的行,unwanted_word并且grep XXXXXXXX仅列出带有pattern的行XXXXXXXX

编辑:

从您的评论看来,您想列出所有不带的行unwanted_word。在这种情况下,您需要做的是:

grep -v 'unwanted_word' file

2
如果我也想在“不需要的单词”行之后排除N行怎么办?-v 'unwanted_word' --after N无济于事,因为它包括第N行和之后的N行。
Andrey Regentov

-v--invert-match选择不匹配的行。就您而言grep -v 'unwanted_word' file还是grep --invert-match 'unwanted_word' file
adamski.pro

我想用匹配模式忽略上方的一行和下方的一行,然后如何实现呢?
Kanji Viroja

太棒了,我在git中使用它可以快速浏览我的回购状态,就像一个魅力:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
很奇怪,这是最好的答案,但在某些情况下是错误的!如果我想找到sun,除非它是sunrisegrep sun|grep -v sunrise跳过同时包含线sunsunrise一次,那是不是我想要的。grep -P 'sun(?!rise)'好多了。
Greene

86

我将问题理解为“我如何匹配一个单词,但排除另一个单词”,为此,一个解决方案是两次串联:第一个grep找到想要的“ word1”,第二个grep排除“ word2”:

grep "word1" | grep -v "word2"

在我的情况下:我需要区分“ gprep”和“ #plot”,这是grep的“ word”选项无法实现的(“#”不是字母数字)。

希望这可以帮助。


16
您应该颠倒顺序以突出显示word1
马修(Matthew)

1
我想这会澄清为该示例添加文件名的占位符
patrick 18'Aug

39

如果您grep支持带有-P选项的Perl正则表达式,则可以执行此操作(如果bash;如果是tcsh,则需要转义!):

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

演示:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

现在让我们列出foofoo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

谢谢你,非常有用!我想提一下,默认情况下,grep命令区分大小写
DocWiki 2011年

2
注意,grep -v -P在正则表达式中也可以不取反地工作。
cybersoft

“如果bash ...您需要逃脱!。谢谢你,谢谢你,谢谢你!那就是我想要的!
加布里埃尔·斯台普斯

36

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

awk '!/word/' file

但是,如果您碰巧遇到一个更复杂的情况,例如XXX想要出现YYY 而不希望出现,那么awk它会派上用场,而不是传递多个greps:

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

您甚至可以说更复杂的内容。例如:我想要那些包含XXX或的行YYY,但不包含ZZZ

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

等等


2
它似乎比grep -P大文件解决方案要快得多。
MBR

@MBR grep -P意味着使用Perl regexp,因此加载该程序包的费用将比normal贵grep
fedorqui'SO停止伤害

10

使用grep -v反转匹配:

grep -v "unwanted word" file pattern

6

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

例如

grep -v 'unwanted_pattern' file_name

这将从文件file_name中输出所有行,其中没有'unwanted_pa​​ttern'。

如果要在一个文件夹中的多个文件中搜索模式,则可以按以下方式使用递归搜索选项

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

在这里,grep将尝试列出当前目录中所有文件中所有'wanted_pa​​ttern'的出现,并将其传递给第二个grep以过滤掉'unwanted_pa​​ttern'。'|' -管道将告诉Shell将左程序的标准输出(grep -r'wanted_pa​​ttern'*)连接到右程序的标准输入(grep -v'unwanted_pa​​ttern')。


4

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

grep -v ^unwanted_word

-5

我的目录里有一堆文件。我想查找所有不包含字符串“ speedup”的文件,因此我成功使用了以下命令:

grep -iL speedup *

1
在手册页中:“ -L,-files-without-match禁止正常输出;而是打印通常不会从中打印任何输出的每个输入文件的名称。 扫描将在第一个匹配项时停止。 ”(强调由我)所以要当心!
xuiqzy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.