Grep的文字颜色

时间:2016-10-14 01:20:25

标签: colors grep zsh oh-my-zsh

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

使用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

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

我怎样才能完成它?

2 个答案:

答案 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或值为空,则应该没有问题。