繁体   English   中英

我怎样才能用grep排除一个词?

[英]How can I exclude one word with grep?

我需要这样的东西:

grep ^"unwanted_word"XXXXXXXX

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

grep -v "unwanted_word" file | grep 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 "word" file及其awk等效项:

awk '!/word/' file

但是,如果您碰巧遇到更复杂的情况,例如,您希望XXX出现而YYY出现,那么awk就派上用场了,而不是通过管道传递几个grep

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

你甚至可以说更复杂的话。 例如:我想要那些包含XXXYYY但不包含ZZZ的行:

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

等等

如果你的grep支持带-P选项的 Perl 正则表达式,你可以这样做(如果是 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 反转匹配:

grep -v "unwanted word" file pattern

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

例如

grep -v 'unwanted_pattern' file_name

这将输出文件 file_name 中没有“unwanted_pattern”的所有行。

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

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

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

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

grep -v ^unwanted_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

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

grep -iL speedup *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM