Awk:使用ANSI转义序列的字符串否定

时间:2016-07-06 22:42:30

标签: bash awk

我有一个功能设置来拖尾文件。

function testtail {
tail -f -n100 $1 | awk '/SNMP/ {print "\033[1;33m" $0 "\033[39m"}' 
}

这可以按预期工作并打印包含我指定颜色的SNMP的所有行但是如何告诉awk还使用字符串SNMP否定任何行,以便与SNMP不匹配的行以另一种颜色打印?我试过了:

function testtail {
tail -f -n100 $1 | awk '/SNMP/ {print "\033[1;33m" $0 "\033[39m"}' '!/SNMP/ {print "\033[1;34m" $0 "\033[39m"}'

}

而且:

function testtail {
tail -f -n100 $1 | awk '/SNMP/ {print "\033[1;33m" $0 "\033[39m"}' | awk '!/SNMP/ {print "\033[1;34m" $0 "\033[39m"}'

}

但是都不行。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

对我来说,看起来你正在寻找一个if-else条件:

... | awk '{if ($0 ~ /SNMP/) {print "\033[1;33m" $0 "\033[39m"} else {print XXX}}'

XXX可以是你想要的任何地方。

或更具惯用性:

... | awk '/SNMP/ {print "\033[1;33m" $0 "\033[39m"; next} {print XXX}' 

由于这些是您要打印的字符串:

  • "\033[1;33m" $0 "\033[39m"
  • "\033[1;34m" $0 "\033[39m"

实际上,您可以使用变量来设置33或34,并保持其余部分保持不变。