答案1
不要用装饰来打印匹配线,而是装饰匹配线并打印所有内容:
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
该awk
程序由三个模式和相关操作组成:
- 匹配的行
User@Host:
用 处理$0 = "\033[32m" $0 "\033[39m"
,它用给定的转义码包围当前行; - 匹配的行
Query_time:
用$0 = "\033[29m" $0 "\033[39m"
;处理 - 模式
1
非零的行(因此所有行)都使用默认操作进行处理,即打印当前行。
这些是累积的:模式与当前行匹配的所有操作都按照定义的顺序执行。User@Host:
修改行匹配(第一个操作)并打印(第三个操作)。Query_time:
修改行匹配(第二个操作)并打印(第三个操作)。打印与两者都不匹配的行(第三个操作)。
这是打印所有行的最简单技术,无需跟踪一行是否已被处理(以避免打印一行两次)。我们不是在每组操作语句中打印某些内容,而是根据需要修改当前行,并且只打印一次(但始终打印它)。