ログファイルの追跡中にawkでsedを呼び出す方法は?

ログファイルの追跡中にawkでsedを呼び出す方法は?

ログファイルを追跡する必要がありますが、sedログに特定の行が表示されたら設定ファイルを編集するコマンドを実行したいと思います。私はほとんど研究をしておらず、これがこれを達成するために使用できることを発見しましたawk

構文は次のとおりです。

tail -f /path/to/serverLog | awk '
                    /Printer is on fire!/ { system("shutdown -h now") }
                    /new USB high speed/  { system("echo \"New USB\" | mail admin") }'

この記事で提案したとおり回答

sedだから私は私自身のバリエーションを書きました:

tail -f logfile | awk '/^Jit ended**/  { system("sed -E '/^Jit/{s/enabled=false/enabled=true/; s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/}' conffile") }'

しかし、うまくいかず、次のエラーが発生します。

(^ syntax error|^ unterminated string)

{}コマンドで構文とsed互換性のない操作を実行しているようですが、awk正確にどこにあるのか、どのように機能させるのかはわかりません。

ベストアンサー1

awkを呼び出して、実行中の他のコマンドを呼び出します。

shell { awk { system { subshell { cmd } } } }

単に

shell { cmd }

これは非常に非効率的で壊れやすいです。

私が言う最善の方法は、(テストされていない)次のことを行うことです。

while IFS= read -r line; do
    case $line in
        *"Printer is on fire!"* ) shutdown -h now ;;
        *"new USB high speed"* )  echo 'New USB' | mail admin ;;
        "Jit ended"* )            tmp=$(mktemp) &&
                                  sed 's/foo/bar/' conffile > "$tmp" &&
                                  mv -- "$tmp" conffile
                                  ;;
    esac
    sleep 1
done < '/path/to/serverLog'

おすすめ記事