如何在 Linux 中使用 grep 的负匹配(打印不匹配的行)

grep
是 Linux 的命令行搜索实用程序,它将打印出文件中与模式或正则表达式匹配的行。反转匹配也很有用,它将过滤掉文件中包含给定字符串的所有行。
负匹配grep
要在 grep
中使用否定匹配,您应该使用 -v
或 --invert-match
标志执行命令。 这将只打印与给定模式不匹配的行。
grep -v "bar" file

请记住,由于 grep
不匹配任何内容,因此无法使用 -o
标志打印“仅匹配项”,因为技术上没有任何匹配项。 grep
可以每行匹配多次,但在这种情况下,是否有多次匹配无关紧要。任何单个匹配项都会导致 grep
忽略该行。
这也适用于正则表达式 (regex),并将打印文件匹配正则表达式的任何行。
grep -v "foo ba[rz]" file

虽然您可以编写进行否定匹配的正则表达式,但通常更容易以这种方式反转匹配。
或者,如果您更喜欢使用 awk
,则可以使用感叹号修饰符来反转正则表达式。
awk '!/bar/' file

负匹配文件名
小写的 -l
标志将导致 grep
打印包含匹配项的文件名,而不是实际匹配的内容。这在扫描文件列表时很有用,但同样,有时反转它也很有用。
-l
的反义词是大写变体 -L
,其作用相反:
grep -L "bar" ./*.txt

确保在打印没有匹配的文件之前,不要使用带有 -L
的 -v
标志来反转匹配,否则你会遇到“双重对立”比赛倒转两次并且没有达到预期效果的情况。