在 bash 中,如果我想执行一个命令并且只显示符合特定模式的输出行,我可以通过管道将其传输到grep
,例如
文件测试文件
hello
there
my
friends
命令
$ cat testfile | grep 'hello'
hello #this will be highlightd
这将突出显示搜索匹配项并显示其所在的整行。我可以使用-A
和-B
显示该行之前和之后的行。我的问题是是否可以执行命令并正常显示所有输出,但像 grep 那样突出显示搜索匹配项?所以我的输出将是
hello #highlighted
there
my
friends
答案1
要使用 Color GREP 仅突出显示匹配的模式但不改变输出:
grep --color=always -e "^" -e "hello" testfile
第一个模式将匹配所有行(所有行都将被打印),第二个模式(以及任何后续模式)导致匹配的文本以彩色突出显示。
由于第一个模式匹配所有行但不匹配可打印字符,它不会添加任何颜色突出显示,因此它不会与突出显示文本的可读性竞争/干扰。
答案2
-z
向您的 GNU grep 命令添加选项:
cat testfile | grep --color=always -z 'hello'
或更短
grep --color=always -z 'hello' testfile
答案3
这个适用于 GNU grep 以及 FreeBSD 上的 grep:
grep --color=always 'hello\|$'
它匹配文本“hello”或(\|
)每行末尾的不可打印空字符串($
)。这就是为什么每行都会被打印,但只有“hello”被突出显示。
您可能已经--color=auto
在 shell 中进行了配置。那么您很可能不需要指定--color=always
:
grep 'hello\|$'
您还可以使用更简单的版本egrep
(使用扩展的正则表达式),其中|
“或”表达式不需要转义:
egrep 'hello|$'
另请参阅 StackOverflow 上的类似问题:彩色 grep - 通过突出显示匹配项来查看整个文件
答案4
这里有一个使用 的解决方案ripgrep
,它是现代的、更易于使用(IMO)和更快的替代品grep
:
cat my-file | rg --passthru '<REGEX>'
您还可以轻松自定义“荧光笔颜色”:
# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'
看man rg
(在线版本)。
为了日常使用我创建了一个 shell 别名:
# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'
现在就这么简单cat my-file | hl '<REGEX>'
。