Answers:
切换颜色是通过嵌入文本的转义序列完成的。程序总是发出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'
printf '\e[31m'; awk …; printf '\e[0m'
您可以让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)'
专门测试红色?
[[:cntrl:]]
。我测试了你的,他们为我工作,即。匹配红色,但不匹配其他颜色。
>&1
吗?我的意思是,红色的东西不会消失2>/dev/null
,对吧?