grep:如何给2个关键字加上颜色?


12

我知道如何使用1命令grep 2个关键字,但是我只能在输出中为其中一个添加颜色。这是我的命令:

grep 'keyword1' file.log | grep 'keyword2'

keyword2突出显示。如何同时keyword1突出显示?

Answers:


15

grep命令接受一个--color=always选项,因此您可以使用

grep 'keyword1' file.log --color=always | grep 'keyword2'

正如gertvdijk指出的那样,该命令可能效率不高,但是它将查找同时包含keyword1和keyword2的所有行。如果要用不同的颜色突出显示它们,可以使用

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

会以蓝色突出显示关键字2。该mt部分表示grep将使用此CSI代码突出显示匹配的文本,并01;34表示“正常背景上的蓝色粗体前景”。


1
+1了解用例的详细说明和自定义选项!
gertvdijk

有趣的是,当我尝试使用以下命令时:grep -R --color = always keyword1。| grep keyword2 //仅突出显示第一个关键字。我该如何调整您的答案以进行递归搜索?
TenLeftFingers 2013年

1
奇怪,grep -R --color=always keyword1 . | grep keyword2应该可以。您是否要再次重定向输出(例如将第二个管道输送grepless -R)?如果是这样,您还需要添加--color=always第二个。
Daniel H

好答案!为了同时突出显示这两者,--color=auto在第二个grep之后紧接着需要一个'keyword2'
路易斯

@Luis是的,您说对了,Grep至少经常默认不设置任何颜色(尽管这可能是配置时的选项?我认为在2013年没有该设置的情况下,我不会对此进行覆盖...)。我添加--color=always了答案,因为您可能希望将其传递给less其他对象。
丹尼尔H,

3

尝试实际的正则表达式,而不是通过管道传递到的另一个实例grep,例如:

grep -E "\<foo\>.*\<bar\>" file

不幸的是,这限制了匹配行,其中关键字仅按此顺序匹配。无论如何,grep在您的问题中使用效率很低,您应该避免使用它。对于您的情况,@ DanielH答案可能要简单得多。

对于关键字的“或”匹配,我会定期使用:

grep -E "(foo|bar)" file

1
我认为OP仅希望包含两个关键字的行(您给出的命令给出了包含一个关键字的所有行)。
Daniel H

@DanielH感谢您指出这一点。我已经更新了答案。
gertvdijk 2012

如果foo在bar之前出现,那还不行吗?我不知道是否有比更好的方法foo.*bar|bar.*foo,或者在这种情况下是否甚至有必要(它似乎是一个日志文件,可能具有关键字的标准顺序)。在更新您的答案之前,我已经添加了答案,但是我会一直保留它,以防万一grep确实需要链式s(或者其他不应将彩色输出发送到终端,如grep | less -R)的情况。
Daniel H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.