より多くのキーワードフィルタリングのためのBashスクリプト

より多くのキーワードフィルタリングのためのBashスクリプト

時間をいただきありがとうございます。

以下のように、bashスクリプトで複数のキーワード01(keyword02、キーワード03...)をフィルタリングしたいと思います。これをどうやって得ることができますか?

すべてのキーワード通知を同じメールアドレスに送信します。

tail -f /var/log/auth.log | while read line do case "$line" in
        *"keyword01"*) echo "$line" | mutt -s "Email notice title" [email protected];
        ;;    esac 
done

ベストアンサー1

たぶん良い

tail -f /var/log/auth.log |
  awk -v cmd='exec mutt -s "Email notice title" [email protected]' '
    /keyword1|keyword2/ {print | cmd; close(cmd)}'

通常、テキストを処理するためにシェルループを使用することは避けますが、次のようにすることもできます。

tail -f /var/log/auth.log |
  while IFS= read -r line; do
    case "$line" in
      (*"keyword1"* | *"keyword2"*) 
        printf '%s\n' "$line" |
          mutt -s "Email notice title" [email protected];;
    esac 
  done

zsh使用することもできます*("keyword1"|"keyword2")*。または、 kshbash -O extglob*@("keyword1"|"keyword2")*

このQ&Aでは、ループを使用してテキストを処理するのが悪い習慣だと思います。ただし、ここではこの行でコマンドを実行する必要があります。これは単純なテキスト処理ではなく、コマンドを実行するシェル操作です。

ここでは、ファイルの読み取りとテキストのマッチングはwithよりも効率的ではありませんが、実行するawkコマンドラインを解釈して実行するためにシェルが呼び出されるmuttため、実行する方が効率的です。awkmutt

これは略語と同様にtail -f file略語です。つまり、ファイルの最後の10行を印刷してから、次のように入力します。tail -n 10 -f filetail filetail -n 10 fileフォローする後でファイルに追加されたすべての内容を印刷するモードです。

私の考えでは、次のようにtail -n+1 -f fileファイル全体を印刷する必要があると思います。次のような、またはtail -n0 -f fileこれからファイルに追加する内容を印刷します。

-F一部の実装tailで名前の変更を検出するオプションも参照してください。通常、回転後は新しい名前に名前が変更され/var/log/auth.logます。新しいファイルに切り替えたい場合は、同じファイル(現在の名前が変更されました)を視聴し続けます。/var/log/auth.log.1/var/log/auth.logtail -f/var/log/auth.logtail -F

おすすめ記事