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

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

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


当前回答

我使用的rcg来自“Linux服务器黑客”,O'Reilly。它非常适合你想要的东西,可以用不同的颜色突出多个表情。

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}

其他回答

要在查看整个文件时突出显示模式,h可以这样做。

另外,它使用不同的颜色来代表不同的图案。

cat FILE | h 'PAT1' 'PAT2' ...

您还可以将h的输出输出到less -R,以便更好地读取。

如果要grep并为每个图案使用一种颜色,cxpgrep可能很适合。

另一个回答提到了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"'

这里有一些方法:

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

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 -C 100 searchtext文件

这将说grep打印100 * 2行上下文,在高亮显示的搜索文本之前和之后。