我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。

我真的想猫一个文件,并看到整个文件与模式匹配突出显示。

是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。


当前回答

这看起来像是恶意入侵。

grep "^\|highlight1\|highlight2\|highlight3" filename

这意味着-匹配行(^)或highlight1或highlight2或highlight3的开头。因此,您将高亮显示所有的highlight*模式匹配,甚至在同一行中。

其他回答

您也可以创建别名。在你的.bashrc(或osx上的.bash_profile)中添加这个函数

function grepe {
    grep --color -E "$1|$" $2
}

你现在可以这样使用别名:"ifconfig | grepe inet"或"grepe css index.html"。

(PS:别忘了源~/。在当前会话上重新加载Bashrc)

另一种肮脏的方式:

grep -A80 -B80 --color FIND_THIS IN_FILE

我做了一个

alias grepa='grep -A80 -B80 --color'

把bashrc打印出来。

如果您想用不同的颜色突出显示几个模式,请参阅这个bash脚本。

基本用法:

echo warn error debug info 10 nil | colog

你可以改变图案和颜色,同时运行按一键,然后进入键。

sed方式

由于已经有很多不同的解,但没有一个把sed表示为解, 而且由于sed比grep更轻、更快,我更喜欢使用sed来完成这种工作:

sed 's/pattern/\o33[47;31;1m&\o033[0m/' file

这似乎不太直观。

\o33是用于生成八进制字符033 ->转义的sed语法。 (一些shell和编辑器还允许输入<Ctrl>-<V>后面跟着<Esc>,直接输入字符。) Esc [47;31日;1m是ANSI转义码:背景灰色,前景红色,加粗。 &将重新打印图案。 Esc [0 m返回默认颜色。

你也可以高亮整行,但把模式标记为红色:

sed -E <file -e \
    's/^(.*)(pattern)(.*)/\o33[30;47m\1\o33[31;1m\2\o33[0;30;47m\3\o33[0m/'

动态尾部-f,紧跟日志文件

使用sed的一个好处是:您可以在控制台上发送警报哔哔声,使用bell ascii字符0x7。我经常像这样使用sed:

sudo tail -f /var/log/kern.log |
    sed -ue 's/[lL]ink .*\([uU]p\|[dD]own\)/\o33[47;31;1m&\o33[0m\o7/'

-u代表无缓冲。所以线条会立即处理。

所以当我连接或断开以太网电缆时,我会听到一些哔哔声。

当然,与链接模式不同的是,您可以在同一个文件中查看USB,甚至在一些/var/log/mail.log中搜索from=…

grep的-z选项也非常灵活!

cat file1 | grep -z "pattern"