对于具有2个或更多模式的文本文件运行grep的bash中是否有一个优雅的方法,并且匹配的每个模式以不同的颜色输出?
因此,在MALE
和AUGUST
上匹配的行会将MALE
置于蓝色,将AUGUST
置于橙色中?
我愿意使用sed
,awk
,grep
和蜡笔或其他......
答案 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)
答案 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"}