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

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

在 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>'

相关内容