cod*_*ict 739

您也可以使用-vgrep选项执行此操作:

grep -v "unwanted_word" file | grep XXXXXXXX
Run Code Online (Sandbox Code Playgroud)

--invert-match将过滤具有grep -v "unwanted_word" file和的行,并unwanted_word仅列出带有模式的行grep XXXXXXXX.

编辑:

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

grep -v 'unwanted_word' file
Run Code Online (Sandbox Code Playgroud)

  • 如果我想在"不需要的单词"之后排除N行,该怎么办?`-v'edove_word' - 后N`没有帮助,因为它包括后面的行和N行. (2认同)
  • 很奇怪,这是最好的答案,但在某些情况下它是错的!如果我想找到`sun`,除非它是`sunrise`,`grep sun | grep -v sunrise`会同时跳过同时包含`sun`和`sunrise`的行,这不是我想要的.`grep -P'sun(?!rise)'`好多了. (2认同)

JPG*_*lly 80

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

grep "word1" | grep -v "word2"
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.

  • 您应该颠倒顺序以突出显示`word1`. (14认同)
  • 我想它会澄清为该示例添加文件名的占位符 (2认同)

cod*_*ict 33

如果你grep支持带有-P选项的Perl正则表达式,你可以这样做(如果是bash;如果tcsh你需要转义!):

grep -P '(?!.*unwanted_word)keyword' file
Run Code Online (Sandbox Code Playgroud)

演示:

$ cat file
foo1
foo2
foo3
foo4
bar
baz
Run Code Online (Sandbox Code Playgroud)

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

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`grep -v -P`在正则表达式中也可以不加取反地工作。 (2认同)

fed*_*qui 30

正确的解决方案是使用grep -v "word" file它的awk等价物:

awk '!/word/' file
Run Code Online (Sandbox Code Playgroud)

但是,如果你碰巧有一个更复杂的情况,你想要XXX出现而YYY 不是出现,那么awk就派上用场而不是管道好几个grep:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it
Run Code Online (Sandbox Code Playgroud)

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

awk '(/XXX/ || /YYY/) && !/ZZZ/' file
Run Code Online (Sandbox Code Playgroud)

等等

  • 它似乎比大文件上的`grep -P`解决方案快得多. (2认同)

gar*_*ima 10

使用grep -v反转匹配:

grep -v "unwanted word" file pattern
Run Code Online (Sandbox Code Playgroud)


st0*_*0le 5

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

grep -v ^unwanted_word
Run Code Online (Sandbox Code Playgroud)


Shr*_*tre 5

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

例如

grep -v 'unwanted_pattern' file_name
Run Code Online (Sandbox Code Playgroud)

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

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

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
Run Code Online (Sandbox Code Playgroud)

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