首页 文章

Colorized grep - 使用突出显示的匹配查看整个文件

提问于
浏览
415

我发现 grep--color=always 标志非常有用 . 但是,grep只打印带匹配的行(除非您要求上下文行) . 鉴于它打印的每一行都有匹配,突出显示不会增加尽可能多的功能 .

我真的很喜欢 cat 一个文件,并看到整个文件突出显示模式匹配 .

有什么方法我可以告诉grep打印正在读取的每一行,无论是否匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇这是否可以使用标准的 grep .

16 回答

  • 12

    使用 colout 程序:http://nojhan.github.io/colout/

    它旨在为文本流添加颜色突出显示 . 给定正则表达式和颜色(例如“红色”),它再现具有突出显示的匹配的文本流 . 例如:

    # 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
    
  • 17

    您还可以创建别名 . 在.bashrc中添加此函数(或在osx上添加.bash_profile)

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

    您现在可以使用如下别名:“ ifconfig | grepe inet " or " grepe css index.html ” .

    (PS:别忘了 source ~/.bashrc 在当前会话中重新加载bashrc)

  • 1

    这是一个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中的文章“So You Like Color

  • 671

    要在查看整个文件时突出显示模式,h可以执行此操作 .

    此外,它为不同的图案使用不同的颜色 .

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

    您还可以将 h 的输出传递给 less -R 以获得更好的读数 .

    要为每个图案设置一个颜色并使用1种颜色,cxpgrep可能非常合适 .

  • 1

    另一个脏的方式:

    grep -A80 -B80 --color FIND_THIS IN_FILE
    

    我做了一个

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

    在bashrc中 .

  • 45

    好的,这是一种方式,

    wc -l filename
    

    会给你行数 - 比如NN,然后就可以了

    grep -C NN --color=always filename
    
  • 0

    如果要突出显示具有不同颜色的多个图案,请参阅this bash脚本 .

    基本用法:

    echo warn error debug info 10 nil | colog
    

    您可以在按下一个键的同时更改图案和颜色,然后输入键 .

  • 0

    另一个答案提到了grep的-Cn开关,它包含n行Context . 我有时用n = 99作为一种快速而肮脏的方式,当egrep模式看起来过于繁琐时,或者当我在没有安装rcg的机器上时,获得[至少]一个完整的上下文和/或ccze .

    我最近发现 ccze 这是一个更强大的着色剂 . 我唯一的抱怨是它是面向屏幕的(比如 less ,我从不使用它),除非你为"raw ANSI"输出指定-A开关 .

    1上面提到的 rcg . 它仍然是我的最爱,因为在别名中自定义非常简单 . 像这样的东西通常在我的〜/ .bashrc中:

    别名tailc ='tail -f / my / app / log / file | rcg发送“BOLD GREEN”收到“CYAN”错误“RED”

  • 74

    以下是一些方法:

    grep --color -E 'pattern|$' file
    grep --color 'pattern\|$' file
    egrep --color 'pattern|$' file
    
  • 6

    您可以使用https://github.com/kepkin/dev-shell-essentials中的 highlight 脚本

    它是 better 而不是 grep 因为你可以用 own color 突出显示每个匹配 .

    $ command_here | highlight green "input" | highlight red "output"
    

    Screen shot from Github project

  • 5

    或者你可以使用The Silver Searcher并做

    ag <search> --passthrough
    
  • 0

    我使用以下命令用于类似目的:

    grep -C 100 searchtext file

    这将说明grep在突出显示的搜索文本之前和之后打印100 * 2行上下文 .

  • 1

    我使用了来自“Linux Server Hacks”的rcg,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
    }
    
  • 1

    我把它添加到我的.bash_aliases:

    highlight() {
      grep --color -E "$1|\$"
    }
    
  • 1

    我想推荐ack -- better than grep, a power search tool for programmers .

    $ 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 regex(3)),并且在搜索许多文件时具有更好的上下文显示 .

  • 15

    这是一回事 . 机会是,无论如何你会少用,所以试试这个:

    less -p pattern file
    

    它将突出显示模式并跳转到文件中第一次出现的模式 .

相关问题