Bash 具有多种颜色的Grep输出?

Bash 具有多种颜色的Grep输出?,bash,colors,sed,awk,grep,Bash,Colors,Sed,Awk,Grep,bash中是否有一种优雅的方法可以对包含两个或多个模式的文本文件运行grep,并且匹配的每个模式都以不同的颜色输出 那么,一条在MALE和AUGUST上匹配的行将以蓝色输出MALE,以橙色输出AUGUST? 我愿意使用sed、awk、grep和蜡笔或其他工具。grep是正则表达式匹配器,而不是语法高亮工具:)。您必须使用多个grep调用,对每个调用使用不同的grep\u COLOR GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" g

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

那么,一条在
MALE
AUGUST
上匹配的行将以蓝色输出
MALE
,以橙色输出
AUGUST

我愿意使用
sed
awk
grep
和蜡笔或其他工具。

grep
是正则表达式匹配器,而不是语法高亮工具:)。您必须使用多个
grep
调用,对每个调用使用不同的
grep\u 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
为您做的)。处理完所有可能的匹配项后,您需要显式打印该行。

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

下面是一个例子:


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

通过指定--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.*$|$'
试试神奇的rpen

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

cp rpen.py /usr/local/bin/rpen
chmod a+rx /usr/local/bin/rpen
然后试试看

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

这个怎么样?你只能用grep来做!这里的诀窍是:(1)你从你正在搜索的单词中获取信息;(2) 您使用的-A和-B选项具有足够大的数字(大于文件的行数)


我需要突出显示文本文件中的字符串,但没有找到适合我需要的方法,因此我编写了一个简单的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
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]*'
下面是一个突出显示ifconfig命令输出的示例:

echo "red blue red blue" | hl -r red -b blue
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]*'
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'\\\\\([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'(错误|删除|溢出):[^0][0-9]*'
指定颜色的顺序很重要:如果字符串匹配多个正则表达式,则第一个正则表达式的优先级高于第二个正则表达式,第二个正则表达式的优先级高于第三个正则表达式,依此类推

希望这能有所帮助。

正适合此目的-突出显示不同颜色的图案

cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY
我的答覆如下:

tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"}  '/MALE/' {print "\033[33m" $0 "\033[39m"}
下面是使用sed的版本。假设您希望将“失败”一词涂成红色,即:

sed 's/\(ERROR\)/\o033[31m\1\o033[39m/'
要将包含“失败”一词的整行标记为红色:

sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/'
sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/'
要将多个单词标记为红色:

sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/'
要将多个单词及其字线标记为红色,请执行以下操作:

sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/'
sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\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代码。

h highlighter是一个小型Bash函数,它自动构建
ack
命令管道,并以与其他两个基于
grep
的答案相同的方式工作。在cygwin上,我发现rpen安装非常简单。我无法让ack和h去工作。用法示例:
$cat~/.bashrc | rpen alias export
如果在
GREP_COLORS
中定义了相同的值,则此操作不起作用(请注意尾随的
S
)-请尝试先取消设置:
$GREP_COLORS=
GREP_COLOR
不推荐使用)要更新整行,修改正则表达式是错误的方法。相反,使用
GREP_COLORS='sl=1;31'grep…
并指定sl为整行着色。如何将最终输出行仅限于匹配单词的行?当前命令打印所有行,但在找到单词时为其上色。我在输出中寻找实际的grep功能。grep_COLORS='sl=1;31'突出了整条线。使用mt=代替
colout
作为着色解决方案可能会有所帮助:
egrep'MALE | AUGUST'file.txt | colout MALE blue | colout AUGUST yellow
或者如果您不需要过滤文本流,只需突出显示它,您可以使用
colout男式蓝色来完成,也可以查看中的cgrep上的答案,与基于脚本的着色解决方案相比,这具有最佳性能。谢谢