我的用例如下:我有一个 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