【发布时间】:2011-05-31 02:38:18
【问题描述】:
我需要类似的东西:
grep ^"unwanted_word"XXXXXXXX
【问题讨论】:
-
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
我需要类似的东西:
grep ^"unwanted_word"XXXXXXXX
【问题讨论】:
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
您可以使用 grep 的 -v (for --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
【讨论】:
-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
我将问题理解为“如何匹配一个单词但排除另一个单词”,其中一个解决方案是串联两个 grep:第一个 grep 找到想要的“word1”,第二个 grep 排除“word2”:
grep "word1" | grep -v "word2"
在我的情况下:我需要区分“plot”和“#plot”,而 grep 的“word”选项不会这样做(“#”不是字母数字)。
希望这会有所帮助。
【讨论】:
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 会派上用场,而不是管道几个greps:
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 *
【讨论】: