
答え1
一致する行を装飾付きで印刷する代わりに、一致する行を装飾してすべてを印刷します。
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
このawk
プログラムは、次の 3 つのパターンと関連するアクションで構成されています。
- 一致する行は
User@Host:
で処理され$0 = "\033[32m" $0 "\033[39m"
、現在の行が指定されたエスケープ コードで囲まれます。 - 一致する行は;
Query_time:
で処理されます。$0 = "\033[29m" $0 "\033[39m"
- パターン
1
がゼロ以外の行 (つまりすべての行) は、現在の行を印刷するというデフォルトのアクションで処理されます。
これらは累積的です。パターンが現在の行に一致するすべてのアクションが、定義されている順序で実行されます。一致する行はUser@Host:
変更され (最初のアクション)、印刷されます (3 番目のアクション)。一致する行はQuery_time:
変更され (2 番目のアクション)、印刷されます (3 番目のアクション)。どちらにも一致しない行は印刷されません (3 番目のアクション)。
これは、行がすでに処理されたかどうかを追跡する必要がなく (行が 2 回印刷されるのを避けるため)、すべての行を印刷する最も簡単な手法です。アクション ステートメントのすべてのセットで何かを印刷する代わりに、現在の行を適切に変更し、それを 1 回だけ印刷します (ただし、常に印刷します)。