59

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

那么一条匹配的线会以蓝色和MALE橙色输出吗?我愿意使用, ,和蜡笔或其他。AUGUSTMALEAUGUSTsedawkgrep

4

10 回答 10

68

通过指定 --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.*$|$'
于 2014-02-28T19:50:30.437 回答
32

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对您有用)。处理完所有可能的匹配后,您需要显式打印该行。

于 2013-06-21T13:34:00.283 回答
19

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

这是一个例子:JBoss 输出

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

于 2014-02-15T06:09:09.307 回答
8

我需要在文本文件中突出显示字符串,但没有找到适合我需要的方法,所以我编写了一个简单的 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]*'

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

希望这可以帮助。

于 2015-03-22T13:13:59.023 回答
3

试试美妙的 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\+" "\?\?" 
于 2014-09-02T21:41:16.353 回答
3

所以这里是使用 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/'

用红色标记多个单词和它们的 wohle 行:

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 代码。

于 2018-07-22T17:24:26.350 回答
1

这个怎么样?你只能用 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 
于 2014-09-19T01:55:53.047 回答
1

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

cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY
于 2017-04-06T21:24:41.023 回答
1

我的回答如下:

tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"}  '/MALE/' {print "\033[33m" $0 "\033[39m"}
于 2018-01-31T11:25:10.407 回答
0

您可以使用专为复杂输出和着色而设计的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

寻找 string: 'sda' 并使那/那些行变成绿色

lsblk | bline -m sda light:green

一些截图

在此处输入图像描述

2. 在此处输入图像描述

3. 在此处输入图像描述

4. 在此处输入图像描述

5. 在此处输入图像描述

于 2021-10-27T11:30:21.940 回答