時間をいただきありがとうございます。
以下のように、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")*
。または、 ksh
。bash -O extglob
*@("keyword1"|"keyword2")*
このQ&Aでは、ループを使用してテキストを処理するのが悪い習慣だと思います。ただし、ここではこの行でコマンドを実行する必要があります。これは単純なテキスト処理ではなく、コマンドを実行するシェル操作です。
ここでは、ファイルの読み取りとテキストのマッチングはwithよりも効率的ではありませんが、実行するawk
コマンドラインを解釈して実行するためにシェルが呼び出されるmutt
ため、実行する方が効率的です。awk
mutt
これは略語と同様にtail -f file
略語です。つまり、ファイルの最後の10行を印刷してから、次のように入力します。tail -n 10 -f file
tail file
tail -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.log
tail -f
/var/log/auth.log
tail -F