【问题标题】:Piping in awk script not working correctlyawk 脚本中的管道无法正常工作
【发布时间】:2013-12-02 11:17:24
【问题描述】:

我有一个在 cron 中运行的观察程序的换行符分隔的 json 输出。 每 5 分钟它会在文件中添加一个新的观察结果。

为了找东西(任何东西)被down掉,然后获取json对象的日期就行了,我运行这个:

 awk '/down/ {print $0 | json date }' observations

这里,json 是我在某处找到的脚本——json K 输出与 json 对象 I 中的键 K 对应的值。

无论如何,运行上面的单行程序会导致 awk 不打印任何内容,并且退出代码是 141。

这是 ubuntu 上的 mawk 1.2。

【问题讨论】:

    标签: json awk


    【解决方案1】:

    awk 不是外壳。您不能像从 C 程序中那样直接从 awk 调用外部命令。 man awk 了解如何调用外部命令。

    【讨论】:

    • 有人愿意分享为什么投反对票吗?答案是 100% 正确的。
    • 不,这个答案是 100% 正确的。您说“我想知道为什么我的 awk 脚本不起作用,而不是如何解决问题。”我的回答告诉你确切的原因。请参阅您发布的参考资料和 awk 手册页。
    • 我不只是说“阅读手册页”,而是告诉了您在手册页中要查找的内容 - 如何调用外部命令。我告诉你为什么你的脚本不起作用,我告诉你在手册页中查找什么来告诉你如何做。
    • awk 的手册页中甚至没有外部这个词。 awk 手册页中没有提到管道。上面提供的链接演示了管道的使用,用于将 awk 中的一些数据块传输到外部命令,而无需使用 system.我的原始问题中似乎缺少双引号,但将它们放入并不能解决问题。
    【解决方案2】:

    不确定您的观察文件看起来如何(也许发布它?),但您不想要这样的东西:

    grep down observations | json date
    

    好的,你也可以试试:

    awk '/down/{c="echo " $1 "| json date";system(c)}' observations
    

    【讨论】:

    • 不,因为每一行都是一个json对象。我必须做for i in grep down observations; do echo $i | json date; done 这几乎可以工作,但我想知道为什么我的 awk 脚本不起作用,而不是如何解决问题。
    • 我的第二个建议对你有用吗?如果是这样,请接受它作为答案。如果没有,请告诉我们发生了什么,以便我们进一步为您提供帮助。
    • 没有。您想将 $1 更改为 $0 所以它是整行。此外,echo 忽略了双引号,双引号包围了 json 中的字符串,因此它不再是正确的 json。因此,json 在echo $0 ... 上失败
    • 好的,将“echo”替换为写入 $0 的临时文件,并将临时文件“cat”到您的 json 工具中。
    • 或者在将字符串传递给 echo 之前将单引号括起来,这样它就不会丢弃双引号。 echo 单引号“hi”单引号产生“hi”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2023-01-19
    • 2014-12-07
    相关资源
    最近更新 更多