Grep输出有多种颜色?

Evi*_*ius 48 bash awk grep sed colors

在使用2个或更多模式的文本文件运行grep的bash中是否有一个优雅的方法,并且匹配的每个模式以不同的颜色输出?

因此,关于行匹配grep,并MALE会出来把AUGUST蓝色和MALE橙色?我打开使用AUGUST,sed,awk和蜡笔或其他...

小智 52

您可以通过指定--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|$'
Run Code Online (Sandbox Code Playgroud)

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

.... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$'
Run Code Online (Sandbox Code Playgroud)


che*_*ner 29

grep是一个正则表达式匹配器,而不是语法高亮显示器:).您将不得不使用多个调用grep,GREP_COLOR每个调用使用不同的值.

GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar
Run Code Online (Sandbox Code Playgroud)

这将突出显示"foo"和"bar"在不同颜色的行中匹配两者.我不认为有一种(简单)方法来处理任何模式的所有出现,而不是合并两个独立调用的输出流:

{ GREP_COLOR="1;32" grep foo file.txt
  GREP_COLOR="1;36" grep bar file.txt
} | ...
Run Code Online (Sandbox Code Playgroud)

这显然与有一种方法为每个正则表达式分配单独的颜色有所不同.


您可以使用awk包装在正确控制代码中的每个匹配来替换它们.

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

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


Eht*_*ury 15

如果你想要开箱即用的东西,你可能正在寻找高亮度显示器.

这是一个例子:JBoss输出

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

  • h highlighter是一个小的Bash函数,可以自动构建`ack`命令管道,其工作方式与其他两个基于grep`的答案相同. (2认同)

小智 8

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

您可以从GitHub下载源代码:

git clone http://github.com/mbornet-hl/hl
Run Code Online (Sandbox Code Playgroud)

然后 :

cd hl/cr; make
Run Code Online (Sandbox Code Playgroud)

这是用法:

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
Run Code Online (Sandbox Code Playgroud)

要将红色的单词"red"和蓝色的单词"blue"着色,您只需输入以下命令:

echo "red blue red blue" | hl -r red -b blue
Run Code Online (Sandbox Code Playgroud)

这是一个突出显示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]*'
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.


小智 5

尝试精彩的 rpen http://github.com/rtulke/rpen

require egrep or grep
Run Code Online (Sandbox Code Playgroud)

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

cp rpen.py /usr/local/bin/rpen
chmod a+rx /usr/local/bin/rpen
Run Code Online (Sandbox Code Playgroud)

然后尝试

ps xau |rpen Ss "S\+" "\?\?" 
Run Code Online (Sandbox Code Playgroud)