显示所有输出但突出显示搜索匹配

ewo*_*wok 68 linux bash grep command-line

在 bash 中,如果我想执行一个命令并且只显示匹配特定模式的输出行,我可以将其通过管道传输到grep,例如

文件测试文件

hello
there
my
friends
Run Code Online (Sandbox Code Playgroud)

命令

$ cat testfile | grep 'hello'
hello #this will be highlightd
Run Code Online (Sandbox Code Playgroud)

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

hello #highlighted
there
my
friends
Run Code Online (Sandbox Code Playgroud)

小智 70

要使用颜色 GREP 仅突出显示匹配的图案但不以其他方式更改输出:

grep --color=always -e "^" -e "hello" testfile
Run Code Online (Sandbox Code Playgroud)

第一个模式将匹配所有行(所有行都将被打印)第二个模式(以及任何后续模式)使匹配的文本以颜色突出显示。

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


Cyr*_*rus 33

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

cat testfile | grep --color=always -z 'hello'
Run Code Online (Sandbox Code Playgroud)

或更短

grep --color=always -z 'hello' testfile
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常粗略的黑客。它具有将整个文件视为一行的效果。因此,(1) 如果文件非常大,可能会耗尽内存,并且 (2) 如果文件不包含模式 *根本*,则不会输出任何内容。 (3认同)
  • @G-Man:更节省资源:`grep --color "hello\|$" 文件` (2认同)

Noa*_*nos 8

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

cat testfile | grep --color -E "hello|$"
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*rný 6

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

grep --color=always 'hello\|$'
Run Code Online (Sandbox Code Playgroud)

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

您可能已经--color=auto在 shell 中进行了配置。那么你很可能不需要指定--color=always

grep 'hello\|$'
Run Code Online (Sandbox Code Playgroud)

您还可以使用更简单的版本egrep(使用扩展的正则表达式),其中|“或”表达式不需要转义:

egrep 'hello|$'
Run Code Online (Sandbox Code Playgroud)