您可以使用 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"
就我而言:我需要区分 grep 的“word”选项不会做的“plot”和“#plot”(“#”不是字母数字)。
希望这可以帮助。
word1
上突出显示。
xnoty() { grep -v "$2" | grep "$1" }
),这样您就不必记住构造。
如果您的 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 -P
在正则表达式中也可以在没有否定的情况下工作。
!
”。谢谢你,谢谢你,谢谢你!这就是我想要的!
(?!.*unwanted_word)keyword
仅排除 unwanted_word
在 keyword
之后 开始的行(可能重叠)。要排除包含 unwanted_word
的 任何 行,无论其相对于 keyword
的位置如何,请使用 ^(?!.*unwanted_word).*\Kkeyword
。
正确的解决方案是使用 grep -v "word" file
及其 awk
等效项:
awk '!/word/' file
但是,如果您碰巧遇到更复杂的情况,例如希望出现 XXX
而 YYY
不 出现,那么 awk
会派上用场,而不是通过管道传递多个 {4 }s:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
你甚至可以说一些更复杂的东西。例如:我想要那些包含 XXX
或 YYY
但不包含 ZZZ
的行:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
等等
grep -P
解决方案快得多。
grep -P
意味着使用 Perl 正则表达式,因此加载该包将比普通 grep
更昂贵。
使用 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 *
不定期副业成功案例分享
-v 'unwanted_word' --after N
没有帮助,因为它包括该行和之后的 N 行。-v
或--invert-match
选择不匹配的行。在您的情况下是grep -v 'unwanted_word' file
或grep --invert-match 'unwanted_word' file
。sun
,除非它是sunrise
,否则grep sun|grep -v sunrise
会同时跳过同时包含sun
和sunrise
的行,这不是我想要的。grep -P 'sun(?!rise)'
好得多。-E
。例如grep -v -E "unwanted_pattern_in_regex" file