我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
当前回答
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=…
其他回答
要在查看整个文件时突出显示模式,h可以这样做。
另外,它使用不同的颜色来代表不同的图案。
cat FILE | h 'PAT1' 'PAT2' ...
您还可以将h的输出输出到less -R,以便更好地读取。
如果要grep并为每个图案使用一种颜色,cxpgrep可能很适合。
这里有一些类似的东西。很有可能,无论如何你都会用得更少,所以试试这个:
less -p pattern file
它将突出显示该模式,并跳转到该模式在文件中第一次出现的位置。
你可以用n跳到下一个出现点,用p跳到前一个出现点,用q退出。
另一种肮脏的方式:
grep -A80 -B80 --color FIND_THIS IN_FILE
我做了一个
alias grepa='grep -A80 -B80 --color'
把bashrc打印出来。
grep的-z选项也非常灵活!
cat file1 | grep -z "pattern"
我想推荐ack——它比grep更好,是程序员的强大搜索工具。
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}" $ ack --passthru pattern files
我喜欢它,因为它默认为递归搜索目录(并且比grep -r聪明得多),支持完整的Perl正则表达式(而不是POSIXish正则表达式(3)),并且在搜索许多文件时具有更好的上下文显示。