如何grep,排除一些模式?

时间:2013-08-27 14:47:31

标签: bash grep

我想在文件中查找出现某种模式且缺少其他模式的行。例如,我需要查找包含loom的所有文件/行,但gloom除外。所以,我可以通过命令找到loom

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

现在,我想搜索loom,不包括gloom。但是,以下两个命令均失败:

grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)

我应该怎样做才能实现目标?

编辑1: 我的意思是loomgloom是字符序列(不一定是单词)。因此,我需要在命令输出中bloomberg,并且不需要ungloomy

编辑2: 有我的期望样本。 以下两行都在命令输出中:

  

我面对着隐约透过香幕的图标。

     

Arty在阴沉的正在蠢蠢欲动

以下两行都不在命令输出中:

  

它是阴郁的 ower可怕 - 伟大的mu mu do do o o o o。

     

在高耸的大厅的西南角

10 个答案:

答案 0 :(得分:82)

如何直接链接greps?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

答案 1 :(得分:17)

没有链接grep的另一种解决方案:

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

在括号之间,您会在g出现之前排除字符loom,除非loom是该行的第一个字符。

答案 2 :(得分:8)

有点老了,但是很好......

来自@houbysoft的最高投票解决方案将无法正常工作,因为即使它有“织布机”,它也会排除任何带有“忧郁”的行。根据OP的预期,我们需要包含“织布机”的线条,即使它们也有“阴郁”。这条线需要在输出中“Arty在阴沉的日子里蠢蠢欲动。”,但是这将被链接的grep排除在外

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

相反,egrep regexBentoy13示例效果更好

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

因为它包含任何带有“织机”的线,无论它是否有“阴郁”。另一方面,如果它只有阴郁,它将不包括它,这正是OP想要的行为。

答案 3 :(得分:7)

只是使用awk,它比grep更简单,让你清楚地表达复合条件。

如果您要跳过同时包含loomgloom的行:

awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

或者如果你想打印它们:

awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

如果现实是你只想要loom单独出现的行:

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

答案 4 :(得分:6)

-v是“倒置匹配”标志,因此管道是一种非常好的方式:

grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"

答案 5 :(得分:5)

/ *你可能会看到这样的东西?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`

BACKQUOTES与命令的括号一样使用,所以在这种情况下启用了-l, BACKQUOTES中的代码将返回文件名,然后使用-vn执行您想要的操作:具有文件名,亚麻布以及实际行。

更新或使用xargs

grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"

希望有所帮助。* /

请忽略我上面写的内容,这是垃圾。

grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"

               #this part gets the filenames with "loom"
#this part gets the lines with "loom"
                                          #this part gets the linenumber,
                                          #filename and actual line

答案 6 :(得分:4)

您可以使用grep -P(perl regex)支持negative lookbehind

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

我为字边界添加了\b

答案 7 :(得分:3)

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

答案 8 :(得分:1)

只需使用! char *a = dup_truncated_at("OneExample", 5); printf("truncated %s\n", a); free(a); /* remember, the value returned from dup_truncated_at has been obtained with a call to malloc() */ 次。

文件内容

grep -v

排除行或匹配项

[root@server]# cat file
1
2
3
4
5

排除行或匹配多个

[root@server]# cat file |grep -v 3
1
2
4
5

答案 9 :(得分:0)

问题:搜索&#39;织机&#39;排除&#39;忧郁&#39;。
回答:

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)