我必须过滤一个非常详细的日志输出,警告或错误的消息之间的唯一模式是输出文本颜色
使用grep时有没有办法按输出颜色进行过滤?
当我尝试使用color code时,由于[
$ echo -e "Default \e[94mLight blue" | grep \e[94m
grep: brackets ([ ]) not balanced
我设法只使用<number color>m
echo -e "Default \e[94mLight blue" | grep 94m
Default 94mLight blue
但它会删除所有颜色格式,更改输出,并且还有可能匹配许多其他不仅仅是颜色格式的文本。
我怎样才能完成它?
答案 0 :(得分:1)
你可以试试这个
echo -e "Default \e[94mLight blue" | sed -n '/\[94m/p'
zsh中为我打印的颜色。我无法包括'\ e'
答案 1 :(得分:0)
有几个地方出错:
字符[
对grep
具有特殊含义,除非您使用--fixed-strings
(简称-F
)选项。所以需要引用它:
grep '\[94m'
还有(似乎是?)没有办法直接为grep指定转义字符(\e
)\e
,{{1}或类似的东西。但您可以使用 zsh的 \033
引用让 zsh 创建转义字符:
$'…'
grep $'\e\\[94m'
内的字符串将像$'…'
内置函数的参数一样处理。因此print
将替换为实际的 Escape字符,\e
需要加倍才能得到一个引用的反斜杠。
请确保使用\
而不使用任何更改格式的选项,例如grep
。默认情况下, Oh-My-Zsh 会创建一个名为--color=auto
的别名,其中包含此选项(如果可用)。
您可以通过添加grep
预命令修饰符来强制 zsh 使用命令而不是别名:
command
总而言之,以下命令应该可以解决问题:
command grep
注1 :由于echo -e "Default \e[94mLight blue" | command grep $'\e\\[94m'
,这需要 zsh 。
$'…'
注意2 :除非日志输出在每行的开头设置颜色代码(也),或者在行的末尾重置它们,否则输出的颜色可能仍然会被破坏。在这种情况下,您可能必须使用echo -e "Default \e[94mLight blue" | command grep $(printf '\033\\[94m')
才能获得更好的结果:
awk
在打印时,会将重置编码器echo "Default \e[94mLight blue\nDefault \e[94mLight blue" |
awk '/\033\[94m/ {printf "%s\033[0m\n", $0}'
附加到每个匹配行的末尾。请注意,awk(至少GNU版本)不使用\e[0m
来表示 Escape字符,您必须使用\e
代替。
您可以使用此命令检查033
是否为别名:
grep
环境变量whence -v grep
也可能设置为包含此类选项。要检查这一点,您可以运行以下命令:
GREP_OPTIONS
这会显示echo "${(t)GREP_OPTIONS}: $GREP_OPTIONS}"
的类型,后跟其值(GREP_OPTIONS
)。如果类型不包含type: value
或值为空,则应该没有问题。