按文本颜色查找
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
) \e
、3
或类似的东西。但是你可以使用 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
或者值为空应该没有问题。
我必须过滤一个非常冗长的日志输出,警告或错误消息之间的唯一模式是输出文本颜色
有没有办法在使用 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
)\e
、3
或类似的东西。但是你可以使用 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
或者值为空应该没有问题。