按颜色过滤命令输出


13

我正在运行的实用程序没有提供过滤其输出的方法。输出文本中没有任何内容表明特定功能失败,但确实显示为红色。输出是如此之长,以至于当它报告一些错误时最后,我不能总是滚动查看发生错误的输出。

如何过滤出非红色文本?

伪代码:

dolongtask | grep -color red

编辑

该命令也会输出其他颜色,我需要能够过滤所有红色的文本。文本着色也是多行的。


1
抱歉,我想问清楚-但所有输出都打开了>&1吗?我的意思是,红色的东西不会消失2>/dev/null,对吧?
mikeserv

Answers:


15

切换颜色是通过嵌入文本的转义序列完成的。程序总是发出ANSI转义序列,因为当今几乎所有终端都支持ANSI转义序列

将前景颜色切换为红色的转义序列是\e[31m,其中\e指定了转义字符(八进制033,十六进制1b,也称为ESC,^[以及其他各种名称)。30-39范围内的数字设置前景色;其他数字设置不同的属性。\e[0m将所有属性重置为其默认值。运行cat -v以检查程序输出的内容,它可能使用某种变体,例如\e[0;31m首先重置所有属性,或者\e[3;31也将斜体字打开(许多终端不支持)。

在ksh,bash或zsh中,您可以使用$'…'启用引号内的反斜杠转义,使您可以键入$'\e'以获取转义符。请注意,然后您必须将要传递给的所有反斜杠加倍grep。在中/bin/sh,您可以使用"$(printf \\e)"或键入文字转义符。

使用GNU grep -o选项,以下代码段过滤红色文本,假设该文本以转义序列开头\e[31m,以\e[0m\e[30m在同一行结束,并且不包含任何嵌入式转义序列。

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

以下awk代码段提取红色文本,即使它是多行也是如此。

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        red = (color ~ /1;*$/)
    }
    red'

这是一个保留变色命令的变体,如果您要过滤多种颜色(此处为红色和洋红色),则可能会很有用。

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        printf "\033%s", substr($0, 1, RLENGTH);
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        desired = (color ~ /[15];*$/)
    }
    desired'

awk解决方案为我工作。有什么办法可以保留输出中的颜色吗?
km6zla 2014年

@ ogc-nick您想要全红色输出吗?printf '\e[31m'; awk …; printf '\e[0m'
吉尔斯(Gilles)'所以

不管我要过滤的任何颜色保留在输出中。
km6zla 2014年

@ ogc-nick查看我的编辑。
吉尔斯(Gillles)“所以-别再邪恶了”

6

您可以让grep查找控制字符,其中一些负责在终端上绘制漂亮的颜色。

dolongtask | grep '[[:cntrl:]]'

例如,这会在grep中回显一个红色的“测试”,这是因为它被控制字符包围了:

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

--color=none是,以确保公正的grep自己的着色并不适用于匹配的输出,但打印全线忠实地使控制字符将被外壳程序解释。


真好 我想知道是否可以走得更远,然后做类似的事情grep -E $'\033\[0?[01];31m.+?\033\[0?0m'grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'专门测试红色?
steeldriver 2014年

我开始提出您所建议的正则表达式,但是在让它们起作用之前,我偶然发现了[[:cntrl:]]。我测试了你的,他们为我工作,即。匹配红色,但不匹配其他颜色。
savanto 2014年

效果很好,但可以匹配任何颜色。我没有在问题中提到它,但是也输出了许多其他颜色,我只想看看红色的东西。+1获取简单有效的代码。
km6zla 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.