【问题标题】:Grep output with multiple Colors?具有多种颜色的Grep输出?
【发布时间】:2013-06-18 15:07:13
【问题描述】:

bash 中是否有一种优雅的方法可以针对具有两个或多个模式的文本文件运行grep,并且每个匹配的模式都以不同的颜色输出?

那么匹配MALEAUGUST 的行会输出蓝色的MALE 和橙色的AUGUST? 我愿意使用sedawkgrep 和蜡笔或其他。

【问题讨论】:

标签: bash colors sed awk grep


【解决方案1】:

通过指定 --color=always 并使用正则表达式 'foo|$' 传递所有行,您可以级联具有不同颜色的 grep。

例如:

tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$'

如果您想突出显示整行,请相应地更新您的正则表达式:

.... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$'

【讨论】:

  • 如果在GREP_COLORS 中定义了相同的值,这将不起作用(注意尾随的S) - 尝试在之前取消设置:$ GREP_COLORS=GREP_COLOR 已弃用)
  • 要更新整行,修改正则表达式是错误的做法。相反,使用GREP_COLORS='sl=1;31' grep ... 并指定 sl 为整行着色。
  • 如何将最终输出行限制在匹配单词的行?当前命令打印所有行,但在找到时为单词着色。我正在输出中寻找实际的 grep 功能。
  • GREP_COLORS='sl=1;31' 突出显示整行。改用 mt=
【解决方案2】:

grep 是正则表达式匹配器,而不是语法高亮器 :)。您必须使用grep 的多次调用,每个调用使用不同的GREP_COLOR 值。

GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar

这将在匹配两者的行中以不同颜色突出显示“foo”和“bar”。我认为没有一种(简单的)方法可以处理任何一种模式的所有次出现,除非合并两个独立调用的输出流:

{ GREP_COLOR="1;32" grep foo file.txt
  GREP_COLOR="1;36" grep bar file.txt
} | ...

这显然与有办法为每个正则表达式分配单独的颜色看起来不同。


您可以使用awk 将每个匹配项替换为包含在正确控制代码中的自身。

 echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m");
                         gsub("foo", "\033[1;36m&\033[0m"); print }'

在每一行中,您将与给定正则表达式匹配的任何内容全局替换为包含在 ANSI 转义序列中的自身 (&) 以获得所需的颜色(grep --color 为您执行此操作)。处理完所有可能的匹配后,您需要显式打印该行。

【讨论】:

    【解决方案3】:

    如果您想要开箱即用的东西,您可能正在寻找hhighlighter

    这是一个例子:

    看看。它对于自动为不同颜色的单词着色非常有用。这是一个令人印象深刻的项目,它建立在 ack 之上。

    【讨论】:

    • h highlighter 是一个小型 Bash 函数,可自动构建 ack 命令管道,其工作方式与其他两个基于 grep 的答案相同。
    【解决方案4】:

    我需要在文本文件中突出显示字符串,但没有找到适合我需要的方法,所以我编写了一个简单的 C 程序来为匹配正则表达式的字符串着色。

    您可以从 GitHub 下载源代码:

    git clone http://github.com/mbornet-hl/hl
    

    然后:

    cd hl/cr; make
    

    这里是用法:

    hl: version 1.21
    Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ...
      -h : help
      -v : version
      -u : do not bufferize output on stdout
      -e : extended regular expressions
      -i : ignore case
      -E : print on stderr
      -r : red
      -g : green
      -y : yellow
      -b : blue
      -m : magenta
      -c : cyan
      -w : white
      -R : red     (reverse video)
      -G : green   (reverse video)
      -Y : yellow  (reverse video)
      -B : blue    (reverse video)
      -M : magenta (reverse video)
      -C : cyan    (reverse video)
      -W : white   (reverse video)
      -d : debug
      -D : display regular expressions
    

    要将单词“red”着色为红色,将单词“blue”着色为蓝色,您只需输入以下命令:

    echo "red blue red blue" | hl -r red -b blue
    

    这是一个突出显示 ifconfig 命令输出的示例:

    hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>'             \
           -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>'            \
           -c '([0-9a-f]{2}:){5}[0-9a-f]{2}'                     \
           -g '\<UP\>|\<RUNNING\>|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \
           -y '^(eth|(vir)?br|vnet)[0-9.:]*\>'                   \
           -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \
           -r ' (errors|dropped|overruns):[^0][0-9]*'
    

    指定颜色的顺序很重要:如果一个字符串匹配多个正则表达式,第一个比第二个优先级高,第二个比第三个优先级高,依此类推。 ..

    希望这会有所帮助。

    【讨论】:

    • 与基于脚本的着色解决方案相比,这具有最佳性能。谢谢!
    【解决方案5】:

    这里是使用 sed 的版本。假设您希望将“FAILED”这个词涂成红色,那就是:

    sed 's/\(ERROR\)/\o033[31m\1\o033[39m/'
    

    要将包含单词“FAILED”的整行标记为红色:

    sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/'
    

    要将多个单词标记为红色:

    sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/'
    

    要将多个单词及其全线标记为红色:

    sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/'
    

    拥有多种颜色(ERROR=red/FAILED=blue)

    sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/'
    

    通过 ssh 使用所有这些:

    ssh user@host -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'"
    

    因为不必每次都输入,只需在 bashrc 中将其声明为函数即可。

    对于其他颜色,请查找 ANSI 代码。

    【讨论】:

      【解决方案6】:

      试试美妙的 rpen http://github.com/rtulke/rpen

      require egrep or grep
      

      现在您需要将 rpen.py 文件复制到正确的文件夹中并赋予它适当的权限

      cp rpen.py /usr/local/bin/rpen
      chmod a+rx /usr/local/bin/rpen
      

      那就试试

      ps xau |rpen Ss "S\+" "\?\?" 
      

      【讨论】:

      • 在 cygwin 上,我发现 rpen 安装非常简单。我无法让 ack 和 h 工作。使用示例:$ cat ~/.bashrc | rpen alias export
      【解决方案7】:

      这个怎么样?你只能用 grep 做到这一点!这里的技巧是(1)您对正在搜索的单词进行/或/; (2) 您使用足够大的数字(大于文件的行数)的 -A 和 -B 选项。

      echo "you make it" > tmp
      echo "you take it" >> tmp
      echo "you cake it" >> tmp
      echo "you bake it" >> tmp
      echo "you wake it" >> tmp
      
      GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 
      

      【讨论】:

        【解决方案8】:

        cxpgrep 正是为此目的 - 突出显示不同颜色的图案。

        cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY
        

        【讨论】:

          【解决方案9】:

          我的答案如下:

          tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"}  '/MALE/' {print "\033[33m" $0 "\033[39m"}
          

          【讨论】:

            【解决方案10】:

            您可以使用专为复杂输出和着色而设计的bline (Beautiful Line Output)。

            所有行,前景红色:

            ls | bline -a red
            

            所有线条,前景红色,背景绿色:

            ls | bline -a red:green
            

            所有行,默认为前景(NOTE.3),背景为绿色:

            ls | bline -a :green
            

            添加颜色模式,奇数行(前景)将是浅色、斜体、红色

            ls | bline -o light:red
            

            也添加文本模式

            ls | bline -o light:italic:cross:red
            

            组合选项没问题:

            ls | bline -a light:green -i red -I 7 -r yellow -R 5-10
            

            使用十六进制值,前景为红色

            df | bline -H -a ff00ff
            

            十六进制,前景绿色,背景红色

            df | bline -H -a 00ff00:ff0000
            

            十六进制只是背景

            df | bline -H -a :ffff00
            

            查找字符串:'sda' 并将该/那些行设为绿色

            lsblk | bline -m sda light:green
            

            一些截图

            2。

            3。

            4。

            5。

            【讨论】:

              猜你喜欢
              • 2021-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-14
              • 2018-10-19
              • 1970-01-01
              • 2023-03-05
              相关资源
              最近更新 更多