答え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回印刷するのを避けるため)。各ジョブステートメントセットから何かを印刷するのではなく、必要に応じて現在の行を変更して一度だけ印刷します(ただし、常に印刷します)。