Awk
如何在跟踪日誌文件時從 awk 呼叫 sed?
我應該關註一個日誌文件,我想
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'