[英]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
你甚至可以说更复杂的话。 例如:我想要那些包含XXX
或YYY
但不包含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.