按文本颜色查找

Grep by text color

我必须过滤一个非常冗长的日志输出,警告或错误消息之间的唯一模式是输出文本颜色

有没有办法在使用 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

但它删除了所有颜色格式,更改了输出并且还有可能匹配许多其他文本,而不仅仅是颜色格式。

我该如何完成?

你可以试试这个

echo -e "Default \e[94mLight blue"  | sed -n '/\[94m/p'

这在 zsh 中为我打印了颜色。我无法包含 '\e'

有几个地方出错了:

  • 字符[grep有特殊意义,除非你使用--fixed-strings(简称-F)选项。所以需要引用:

    grep '\[94m'
    
  • 还有(似乎是?)无法直接为 grep 指定 转义字符 (\e) \e3 或类似的东西。但是你可以使用 zsh's $'…' 引用让 zsh 创建 Escape 字符 :

    grep $'\e\[94m'
    

    $'…' 中的字符串将像 print 内置函数的参数一样处理。因此 \e 将替换为实际的 转义字符 并且 \ 需要加倍才能获得单个带引号的反斜杠。

  • 请确保使用 grep 时不带任何更改格式的选项,例如 --color=auto。默认情况下 Oh-My-Zsh 会创建一个名为 grep 的别名,其中包含此选项(如果可用)。

    您可以强制 zsh 使用命令而不是别名,方法是在 command precommand modifier :

    command grep
    

总而言之,以下命令应该可以解决问题:

echo -e "Default \e[94mLight blue" | command grep $'\e\[94m'

注1:由于$'…',这需要zsh。一个更便携的版本是

echo -e "Default \e[94mLight blue" | command grep $(printf '3\[94m')

注2:除非日志输出在每行的开头设置颜色代码(也)或在行尾重置它们,否则输出的颜色可能仍然被打破。在这种情况下,您可能必须使用 awk 才能获得更好的结果:

echo "Default \e[94mLight blue\nDefault \e[94mLight blue" | 
  awk '/3\[94m/ {printf "%s3[0m\n", [=15=]}'

这会在打印时将重置编码器 \e[0m 附加到每个匹配行的末尾。请注意,awk(至少是 GNU 版本)不使用 \e 来表示 转义字符 ,您必须使用 033 来代替。


您可以使用此命令检查 grep 是否是别名:

whence -v grep

也有可能环境变量GREP_OPTIONS被设置为包含这些选项。要检查这一点,您可以 运行 这个命令:

echo "${(t)GREP_OPTIONS}: $GREP_OPTIONS}"

这显示了 GREP_OPTIONS 的类型及其值 (type: value)。如果类型不包含export或者值为空应该没有问题。