ChatGPT解决这个技术问题 Extra ChatGPT

如何用 grep 排除一个单词?

我需要类似的东西:

grep ^"unwanted_word"XXXXXXXX
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"

n
normanius

您可以使用 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

如果我想在“不需要的单词”行之后排除 N 行怎么办? -v 'unwanted_word' --after N 没有帮助,因为它包括该行和之后的 N 行。
-v--invert-match 选择不匹配的行。在您的情况下是 grep -v 'unwanted_word' filegrep --invert-match 'unwanted_word' file
我想用匹配的模式忽略上面的一行和下面的一行,那么我该如何实现呢?
奇怪,这是最佳答案,但在某些情况下它是错误的!如果我想找到 sun,除非它是 sunrise,否则 grep sun|grep -v sunrise 会同时跳过同时包含 sunsunrise 的行,这不是我想要的。 grep -P 'sun(?!rise)' 好得多。
如果您想将正则表达式的功能带入排除模式,只需添加 -E。例如grep -v -E "unwanted_pattern_in_regex" file
E
EdChum

我将问题理解为“我如何匹配一个单词但排除另一个单词”,其中一个解决方案是两个串联的 grep:第一个 grep 找到想要的“word1”,第二个 grep 不包括“word2”:

grep "word1" | grep -v "word2"

就我而言:我需要区分 grep 的“word”选项不会做的“plot”和“#plot”(“#”不是字母数字)。

希望这可以帮助。


您应该颠倒顺序以在 word1 上突出显示。
我想它会澄清为该示例添加文件名的占位符
@MatthewRead 我发现它真的更像这样的逻辑。首先,您要查找“word1”的出现,然后删除也有“word2”的出现。相反的情况很奇怪:首先删除“word2”,然后查找您想要的单词。也许这只是一个观点
@Nico 不过,在找到更有用的东西后,没有理由继续坚持你最初的冲动。如果您经常使用它,我建议您创建一个可以调用的 shell 函数(如 xnoty() { grep -v "$2" | grep "$1" }),这样您就不必记住构造。
a
amos

如果您的 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 命令默认区分大小写
请注意,grep -v -P 在正则表达式中也可以在没有否定的情况下工作。
“如果 bash...您需要转义 !。谢谢你,谢谢你,谢谢你!这就是我想要的!
但是,这不适用于 `grep -P '(?!.*foo3)[a-zA-Z0-9]*' 模式,它不会找到您想要省略的内容,但会找到只有确切的东西,所以正则表达式对于一个确切的短语几乎没有用
建议的模式 (?!.*unwanted_word)keyword 仅排除 unwanted_wordkeyword 之后 开始的行(可能重叠)。要排除包含 unwanted_word任何 行,无论其相对于 keyword 的位置如何,请使用 ^(?!.*unwanted_word).*\Kkeyword
f
fedorqui

正确的解决方案是使用 grep -v "word" file 及其 awk 等效项:

awk '!/word/' file

但是,如果您碰巧遇到更复杂的情况,例如希望出现 XXXYYY 出现,那么 awk 会派上用场,而不是通过管道传递多个 {4 }s:

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

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

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

等等


它似乎比处理大文件的 grep -P 解决方案快得多。
@MBR grep -P 意味着使用 Perl 正则表达式,因此加载该包将比普通 grep 更昂贵。
g
garima

使用 grep -v 反转匹配:

grep -v "unwanted word" file pattern

S
Shriganesh Shintre

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')。


s
st0le

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

grep -v ^unwanted_word

W
Worthwelle

我使用 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

b
bobble bubble

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

grep -iL speedup *

从手册页:“-L,--files-without-match 禁止正常输出;而是打印通常不会打印输出的每个输入文件的名称。扫描将在第一次匹配时停止。” (我强调)所以要小心这个!