【问题标题】:Buffer records in GNU awkGNU awk 中的缓冲区记录
【发布时间】:2014-02-07 00:44:58
【问题描述】:

我正在尝试制作一个可以实时观看一些日志的脚本。我有一个请求日志,每个请求的格式如下,

---
id=273482
Result=Error
---
id=342345
Result=Success
---

还有第二个日志,其中每一行都有请求的 id。我需要实时观看请求日志并将其与第二个日志交叉引用。

 tail -f requestLog | awk \"BEGIN { RS = \"---\" } /Error/\" | grep --line-buffered id | sed -u ...

我 tail -f 请求日志,使用 awk 拆分“---”上的记录,然后 grep 出 id 行。然后,我将所有这些传递给 sed -u 以提取 id 和 xargs 以 grep 第二个日志中与错误请求相关的行。

问题是结果出来真的延迟,因为某些东西(我认为 awk)缓冲错误。如何让 awk 不间断地读取输入并在每次看到错误记录时刷新输出?顺便说一句,我正在使用 GNU awk。

【问题讨论】:

    标签: bash shell scripting awk


    【解决方案1】:

    GNU awk 有一个 fflush() 可以用来刷新缓冲区:

    .. | awk 'BEGIN { RS = "---" } /Error/ { print; fflush(); }' | ..
    

    有了这个,你已经对管道中的所有阶段进行了行缓冲。

    如果您将来在管道中有任何其他程序不支持诸如 awk fflushgrep --line-bufferedsed -u 之类的东西,GNU coreutils 有一个更通用的 stdbuf,您可以与任何程序一起使用:

    .. | stdbuf -o 0 any_other_command | ..
    

    【讨论】:

      【解决方案2】:

      这里是修复

      tail -f requestLog|awk 'BEGIN{RS="--*"}/Error/{split($1,a,"=");print a[2]}'
      

      【讨论】:

        猜你喜欢
        • 2018-12-20
        • 2017-05-14
        • 2021-09-18
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多