假设我有一个为终端着色的命令的输出。我想匹配任何包含黄色的行。我怎样才能在 grep 中做到这一点,例如:mycommand -itSomtimesPrintsLinesWithYellowColorCodes | grep -e "?????"
注意:这不是关于对 grep 的输出进行着色或添加任何颜色。这只是关于如何过滤/匹配进入 grep 的输入的颜色。
答案1
让我们用它tput
来为您的终端生成黄色和黑色的颜色代码:
$ yel=$(tput setaf 3)
$ blk=$(tput setaf 0)
我们来看看黄色代码实际上包含什么:
$ echo -n "$yel" | hexdump -C
00000000 1b 5b 33 33 6d |.[33m|
00000005
现在,我们可以用来grep
搜索黄色代码并打印从黄色代码开头到下一个代码匹配的字符串,无论该代码是什么:
$ echo "abc ${yel}Yellow${blk} def" | grep -Eo $'\x1b\[33m.[^\x1b]*\x1b\[....'
Yellow
请注意,黄色的颜色代码包括[
被grep
认为是正则表达式活动字符的字符。因此,为了匹配文字[
,我们需要将其转义为grep
。为此,我们使用 bash$'...'
来定义带有 [` 转义的颜色代码。
我们使用了两个选项grep
:-E
告诉grep
使用(现代)扩展正则表达式。该选项-o
指示grep
仅打印匹配行的匹配(非空)部分,每个此类部分都在单独的输出行上。
您的终端上可能有多个代码会产生黄色。您将需要检查您正在使用的任何命令的输出,以确定正在使用哪些代码并将它们包含在您的grep
命令中。