Grep输出有多种颜色?

时间:2013-06-21 13:06:27

标签: bash colors sed awk grep

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

因此,在MALEAUGUST上匹配的行会将MALE置于蓝色,将AUGUST置于橙色中? 我愿意使用sedawkgrep和蜡笔或其他......

9 个答案:

答案 0 :(得分:49)

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

例如:

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.*$|$'

答案 1 :(得分:26)

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 {1}}包含在ANSI转义序列中以获得所需颜色(&为您执行的操作)。处理完所有可能的匹配后,您需要明确打印该行。

答案 2 :(得分:14)

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

以下是一个示例:JBoss output

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

答案 3 :(得分:7)

我需要在文本文件中突出显示字符串,并且找不到适合我需要的方法,所以我写了一个简单的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"红色,和#34;蓝色"在蓝色中,您只需输入以下命令:

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]*'

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

希望这有助于。

答案 4 :(得分:2)

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

需要egrep或grep

cp rpen.py / usr / local / bin / rpen chmod 777 / usr / local / bin / rpen

然后尝试

ps xau | rpen Ss“S +”“\?\?”

答案 5 :(得分:1)

所以这是使用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 =红色/ FAILED =蓝色)

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 :(得分:0)

这个怎么样?你只能用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 

答案 7 :(得分:0)

cxpgrep适用于此目的 - 突出显示不同颜色的图案。

cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY

答案 8 :(得分:0)

我的回答如下:

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