grep:显示所有输出,但突出显示搜索匹配项


41

在bash中,如果我想执行命令并仅显示与特定模式匹配的输出行,则可以将其通过管道传递给grep,例如

文件测试文件

hello
there
my
friends

命令

$ cat testfile | grep 'hello'
hello #this will be highlightd

这将突出显示搜索匹配项并显示其所在的整行。我可以使用-A-B显示该行之前和之后的行。我的问题是是否可以正常执行命令并显示所有输出,但是要像grep这样突出显示搜索匹配项呢?所以我的输出是

hello #highlighted
there
my
friends

Answers:


38

要使用Color GREP仅突出显示匹配的图案,而不以其他方式更改输出,请执行以下操作:

grep --color=always -e "^" -e "hello" testfile

第一个模式将匹配所有行(将打印所有行),第二个模式(以及随后的任何模式)将使匹配的文本突出显示为彩色。

由于第一个模式匹配所有行,但在可打印字符上不匹配,因此它不添加任何突出显示的颜色,因此不会与突出显示的文本的可读性竞争/干扰。


kubectl apply -k . | grep --color=always -e "^" -e "configured"在zsh中使用kubectl
Michael Cole

要在Bash中使用:highlight(){grep --color = always -e“ ^” -e $ *; }
乔恩(Jon)

这在FreeBSD上也适用,您只需要交换第一和第二个模式("^"需要是第二个)。
玛丽安·塞尔尼

25

-z向您的GNU grep命令添加选项:

cat testfile | grep --color=always -z 'hello'

或更短

grep --color=always -z 'hello' testfile

3
这是一个非常粗糙的技巧。它具有将整个文件视为一行的效果。因此,(1)如果该文件是非常大的,可能存在的存储器耗尽的可能性,以及(2)如果所述文件不包含所述图案在所有,则什么也不会输出。
G-Man说'Resstate Monica''Feb

支持什么版本的grep?在grep 2.5.4上,-z似乎不可用...
Alex

@Alex:我使用的是GNU grep版本2.6.3。
赛勒斯(Cyrus)

2
@ G-Man:节省更多资源:grep --color "hello\|$" file
Cyrus

@Cyrus:是的,这是一个更好的答案。不幸的是,它基本上等同于bot779对这个问题的回答,并且几乎与我所链接的问题的公认答案(12)相同。
G-Man说'恢复莫妮卡''18

4

与上一个答案类似,您可以捕获所有$行尾:

cat testfile | grep --color -E "hello|$"

-E(或--extended-regexp)表示必须使用来转义特殊字符\。使用时,|将被视为正则表达式“ OR”条件。

Grep |$还将捕获并打印所有以结尾结尾的行,但是由于$是隐藏字符,因此无法突出显示。

更新:

如果您想打印所有输出,并且还返回退出代码(无论是否找到匹配项),则可以使用perl命令:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

如果您更喜欢sed-这是一个示例,该示例如何突出显示所有匹配项,如果找不到匹配项,则返回退出代码https : //askubuntu.com/a/1200851/670392


2

这适用于GNU grep以及FreeBSD上的grep:

grep --color=always 'hello\|$'

它与\|每行($)末尾的文本“ hello”或()不可打印的空字符串匹配。这就是为什么每行都被打印但只突出显示“ hello”的原因。

您可能已经--color=auto在Shell中进行了配置。然后,您很可能不需要指定--color=always

grep 'hello\|$'

您也可以通过使用egrep(带有扩展的正则表达式)来简化版本,其中不需要|对“或”表达式进行转义:

egrep 'hello|$'

这不能回答如何显示所有输入行。
克里斯·佩奇

@ChrisPage我会这么说:这就是为什么每行都被打印但只突出显示“ hello”的原因。
玛丽安·塞尔尼

0

添加到上面的最高答案。注释中提到的highlight {}函数仅在将数据通过管道传递到其中时才起作用。以下别名虽然不完美,但更有用:

alias greph="grep --color=always -e^ -e"

这适用于以下命令:

greph foo bar.txt

cat bar.txt | greph foo
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.