我需要这样的东西:
grep ^"unwanted_word"XXXXXXXX
如果您的grep支持Perl正则表达式与-P选项,您可以这样做(如果bash;如果tcsh你需要转义!):
grep
-P
!
grep -P '(?!.*unwanted_word)keyword' file
演示:
$ cat file foo1 foo2 foo3 foo4 bar baz
现在让我们列出除了foo3之外的所有foo
foo3
foo
$ grep -P '(?!.*foo3)foo' file foo1 foo2 foo4 $
-v选项将显示与模式不匹配的所有行。
-v
grep -v ^unwanted_word
使用grep -v进行反向匹配:
grep -v "unwanted word" file pattern
你可以使用grep的-v(对于--invert-match)选项:
--invert-match
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file将过滤有unwanted_word的行,而grep XXXXXXXX将只列出有XXXXXXXX模式的行。
grep -v "unwanted_word" file
unwanted_word
grep XXXXXXXX
XXXXXXXX
编辑:
从您的注释中,看起来您想要列出没有unwanted_word的所有行。在这种情况下,你只需要:
grep -v 'unwanted_word' file
我把这个问题理解为“如何匹配一个单词但排除另一个”,对此的一个解决方案是两个grep串联:第一个grep找到想要的“word1”,第二个grep排除“word2”:
grep "word1" | grep -v "word2"
在我的例子中:我需要区分“plot”和“#plot”,grep的“word”选项不会这样做(“#”不是字母数字)。
希望这能有所帮助。
Grep提供了'-v'或'——invert-match'选项来选择不匹配的行。
如。
grep -v 'unwanted_pattern' file_name
这将输出文件file_name中的所有行,该文件没有'unwanted_pattern'。
如果您在一个文件夹内的多个文件中搜索模式,您可以如下所示使用递归搜索选项
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
正确的解决方案是使用grep -v "word" file和它的awk等价:
grep -v "word" file
awk
awk '!/word/' file
然而,如果你碰巧有一个更复杂的情况,你想要,比如,XXX出现,YYY 不出现,那么awk就很方便了,而不是管道几个# eyz3:
XXX
YYY
awk '/XXX/ && !/YYY/' file # ^^^^^ ^^^^^^ # I want it | # I don't want it
你甚至可以说一些更复杂的东西。例如:我想要那些包含XXX或YYY的行,但不是ZZZ:
ZZZ
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
等。
我有一个目录,里面有很多文件。我想找到所有不包含字符串“加速”的文件,所以我成功地使用了以下命令:
grep -iL speedup *
我使用grep -vw "^/"排除了根("/")挂载点。
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