如何在awk的结果中为不同字段打印不同颜色?

20

这个文件有3个字段。我想要把前两个字段标记为绿色,第三个字段标记为白色(注意:黑色背景)。因此我尝试了以下代码:

awk '{print "\033[0;32m"$1"\033[0m", "\033[0;32m"$2"\033[0m", "\033[0;37m"$3"\033[0m"} }' chrono.txt

而且一切都是绿色的...

我应该如何操作(如果可能的话)?

2个回答

35

要从awk获得有色彩的输出,您可以使用以下方法。

function red(s) {
    printf "\033[1;31m" s "\033[0m "
}

function green(s) {
    printf "\033[1;32m" s "\033[0m "
}

function blue(s) {
    printf "\033[1;34m" s "\033[0m "
}

{
    print red($1), green($2), blue($3)
}

10
小心使用这些函数。它们使用外部字符串作为格式说明符。如果该字符串包含格式字符(%等),则会失败。最好使用类似于 function red(string) { printf ("%s%s%s", "\033[1;31m", string, "\033[0m "); } 这样的东西。 - Juan Calero
我无法让答案起作用,甚至连这个建议也不行。但是以下方法对我有效: function yellow(s) {return "\033[1;93m" s "\033[1;39m"} - Tim

10
使用 shell 变量传递颜色是 awk 函数的替代方案。例如:
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
BLUE='\033[01;34m'
NONE='\033[0m'

echo "Col1 Col2 Col3 Col4" | \
awk -v r=$RED -v y=$YELLOW -v g=$GREEN -v b=$BLUE -v n=$NONE \
 '{printf r$1n y$2n g$3n b$4n "\n"}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接