Awk

如何在跟踪日誌文件時從 awk 呼叫 sed?

  • October 5, 2021

我應該關註一個日誌文件,我想sed在日誌中出現特定行時啟動一個命令來編輯 conffile。我做了很少的研究,發現它可以用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變體寫了我自己的like:

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語法的事情,但不知道到底在哪裡,以及如何讓它工作。

通過呼叫 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'

引用自:https://unix.stackexchange.com/questions/671961