Awk のみを使用して Tail -f 出力を色付きで表示し、残りの出力を表示するにはどうすればよいでしょうか?

Awk のみを使用して Tail -f 出力を色付きで表示し、残りの出力を表示するにはどうすればよいでしょうか?

tail -fコマンドを使用して色付き出力を行うことができましたawk。しかし、その 2 行のみがフィルタリングされているようなので、ログの残りの部分をどのように出力すればよいかわかりません。ログが書き込まれるときに他の行も確認したいです。

awk残りの出力を表示するには、コマンドに何を入力する必要がありますか?

私の問題の画像。上の赤いテキストは を使用せずにawk全体を表示していますtail -f log。その下には、色フィルタリングを使用した同じコマンドがありますawk

ここに画像の説明を入力してください

答え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 回だけ印刷します (ただし、常に印刷します)。

関連情報