我需要这样的东西:

grep ^"unwanted_word"XXXXXXXX

当前回答

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

awk '!/word/' file

然而,如果你碰巧有一个更复杂的情况,你想要,比如,XXX出现,YYY不出现,那么awk就很方便了,而不是通过管道处理几个grep:

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

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

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

etc.

其他回答

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

grep -v ^unwanted_word

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

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

演示:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

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

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

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

awk '!/word/' file

然而,如果你碰巧有一个更复杂的情况,你想要,比如,XXX出现,YYY不出现,那么awk就很方便了,而不是通过管道处理几个grep:

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

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

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

etc.

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

grep "word1" | grep -v "word2"

在我的例子中:我需要区分“plot”和“#plot”,grep的“word”选项不会这样做(“#”不是字母数字)。

我通过使用grep -vw“^/”排除了根(“/”)挂载点。

# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}'
/
/root/.m2
/root
/var

# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}' | grep -vw "^/"
/root/.m2
/root
/var