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)
与上一个答案类似,您可以捕获所有$行尾:
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
这个适用于 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)