我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
当前回答
grep的-z选项也非常灵活!
cat file1 | grep -z "pattern"
其他回答
另一个回答提到了grep的-Cn开关,其中包含n行Context。当egrep模式看起来太复杂,或者当我在一台没有安装rcg和/或ccze的机器上时,我有时会用n=99作为一种快速而肮脏的方式来获得[至少]满屏的上下文。
我最近发现ccze是一个更强大的着色剂。我唯一的抱怨是它是面向屏幕的(就像less一样,我从不使用这个原因),除非你为“原始ANSI”输出指定-A开关。
上面提到的RCG +1。它仍然是我的最爱,因为它是如此简单,自定义在一个别名。类似这样的东西通常在我的~/.bashrc中:
alias tailc='tail -f /my/app/log/file | rcg send "BOLD GREEN" receive "CYAN" error "RED"'
下面是一个shell脚本,它使用Awk的gsub函数来替换你正在搜索的文本,使用正确的转义序列以亮红色显示:
#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2
像这样使用它:
$ ./cgrep pattern [file]
不幸的是,它不具备grep的所有功能。
要了解更多信息,您可以参考Linux Journal上的文章“所以您喜欢颜色”
我把这个添加到我的.bash_aliases中:
highlight() {
grep --color -E "$1|\$"
}
grep的-z选项也非常灵活!
cat file1 | grep -z "pattern"
您也可以创建别名。在你的.bashrc(或osx上的.bash_profile)中添加这个函数
function grepe {
grep --color -E "$1|$" $2
}
你现在可以这样使用别名:"ifconfig | grepe inet"或"grepe css index.html"。
(PS:别忘了源~/。在当前会话上重新加载Bashrc)