
我的用例如下:我有一個 Apache 日誌文件,其中僅記錄來自 PHP 的 json 資料。由於 Apache 列印日誌的方式,我必須使用 awk 修剪每行的開頭和結尾。結果是一個 json 字串,我想用 jq 漂亮地打印它。
為了從 tail 通過管道傳輸到 awk,我必須使用 stdbuf。我想出的完整命令是這樣的:
stdbuf -o0 tail -f -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq
這是行不通的。我認為這是因為 jq,但是 --stream 或 --unbuffered 也不起作用。
有人知道如何做我想做的事嗎?
編輯: 一個範例 JSON 就是
{"foo": "bar"}
這將正確顯示,但如果在 tail 運行時寫入 json,則不會顯示。
答案1
我剛剛找到了一個解決方案:您必須使用 stdbuf -oO“取消緩衝”每個命令。所以它應該看起來像這樣:
stdbuf -o0 tail -f -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq