如何根据条件为awk的输出着色

时间:2015-02-17 23:55:03

标签: shell awk

我有一个包含fallowing的输入文件test.txt:

 a 1 34
 f 2 1
 t 3 16
 g 4 11
 j 5 16

我使用awk只打印字符串2和3:

awk '{print $2 " " $3}' test.txt

是否有办法根据条件仅为输出的第二个字符串着色,如果值大于15,则以橙色打印,如果值大于20,则以红色打印。它会给出相同但有色的:

1 34(red)
2 1
3 16(orange)
4 11
5 16(orange)

输入可能包含更多不同顺序的行。

3 个答案:

答案 0 :(得分:9)

这个awk命令应该做你想要的:

awk -v red="$(tput setaf 1)" -v yellow="$(tput setaf 3)" -v reset="$(tput sgr0)" '{printf "%s"OFS"%s%s%s\n", $1, ($3>20)?red:($3>15?yellow:""), $3, reset}'

这里的关键位是

  • 使用tput来获取为当前终端设置颜色的正确表示(而不是硬编码特定的转义序列)
  • 使用-v设置awk命令用于构造输出的变量值

上面的脚本简洁明了,但写得不那么简洁:

{
    printf "%s"OFS, $1
    if ($3 > 20) {
        printf "%s", red
    } else if ($3 > 15) {
        printf "%s", yellow
    }
    printf "%s%s\n", $3, reset
}

编辑:Ed Morton正确地指出,通过使用color变量并将颜色选择与打印分开,可以简化上面的awk程序。像这样:

awk -v red="$(tput setaf 1)" -v yellow="$(tput setaf 3)" -v reset="$(tput sgr0)" \
'{
    if ($3>20) color=red; else if ($3>15) color=yellow; else color=""
    printf "%s %s%s%s\n", $1, color, $3, reset
}'

答案 1 :(得分:3)

您可以执行以下操作:

awk '{printf "%s ", $2}
     $3 > 15 {printf "\033[33m"}
     $3 > 20 {printf "\033[31m"}
     {printf "%s\033[0m\n", $3}' test.txt

不幸的是,我不知道橙色ansi转义码......

另一种方法:

awk -v color1="\033[33m" -v color2="\033[31m" -v reset="\033[0m" '
     $3 > 15 && $3 <= 20 {$3=color1 $3 reset}
     $3 > 20 {$3=color2 $3 reset}
     {print $2, $3}' test.txt

答案 2 :(得分:2)

awk '{if($2>15 && $2<=20){$2="\033[1;33m" $2 "\033[0m"};if($2>20){$2="\033[1;31m" $2 "\033[0m"};print}' file

击穿

($2>15 && $2<=20){$2="\033[1;33m" $2 "\033[0m"}  # if field 2>15 and =<20, then add colour code to field 2.

if($2>20){$2="\033[1;31m" $2 "\033[0m"} ## if field 2>20, then add colour code to field 2.

print #print line afterwards