我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
当前回答
我把这个添加到我的.bash_aliases中:
highlight() {
grep --color -E "$1|\$"
}
其他回答
使用着色程序:http://nojhan.github.io/colout/
它的目的是为文本流添加颜色高亮。给定一个正则表达式和一个颜色(例如:"red"),它会重新生成匹配突出显示的文本流。例句:
# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile
你可以链接多个调用来添加多个不同的颜色高亮:
tail -f /var/log/nginx/access.log | \
colout ' 5\d\d ' red | \
colout ' 4\d\d ' yellow | \
colout ' 3\d\d ' cyan | \
colout ' 2\d\d ' green
或者你可以通过使用带有N个组的正则表达式(正则表达式的括号部分)来实现同样的事情,后面跟着一个逗号分隔的N种颜色列表。
vagrant status | \
colout \
'\''(^.+ running)|(^.+suspended)|(^.+not running)'\'' \
green,yellow,red
另一种肮脏的方式:
grep -A80 -B80 --color FIND_THIS IN_FILE
我做了一个
alias grepa='grep -A80 -B80 --color'
把bashrc打印出来。
这里有一些方法:
grep --color 'pattern\|$' file
grep --color -E 'pattern|$' file
egrep --color 'pattern|$' file
|符号是OR运算符。要么使用\转义它,要么通过添加-E或使用egrep命令而不是grep告诉grep搜索文本必须解释为正则表达式。
搜索文本“pattern|$”实际上是一个技巧,它将匹配具有模式的行或具有结束的行。因为所有的行都有一个结尾,所有的行都被匹配,但是一行的结尾实际上不是任何字符,所以它不会被着色。
要通过管道传递有颜色的部分,例如向less传递,请向——color提供always参数:
grep --color=always 'pattern\|$' file | less -r
grep --color=always -E 'pattern|$' file | less -r
egrep --color=always 'pattern|$' file | less -r
或者你也可以使用银色搜索器
ag <search> --passthrough
下面是一个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上的文章“所以您喜欢颜色”