【问题标题】:AWK: execute CURL on each line and parse resultAWK:在每一行上执行 CURL 并解析结果
【发布时间】:2011-07-18 21:00:53
【问题描述】:

给定一个包含以下行的输入流:

123
456
789
098
...

我想打电话

curl -s http://foo.bar/some.php?id=xxx

其中 xxx 是每一行的编号,并且每次让 awk 脚本从 curl 输出中获取一些信息,这些信息会写入输出流。我想知道如果不通过以下方式使用 awk“system()”调用是否可行:

cat lines | grep "^[0-9]*$" | awk '
    {
        system("curl -s " $0 \
        " | awk \'{ #parsing; print }\'")
    }'

【问题讨论】:

  • 我发现这个问题在输入来自“真实”流而不是文件的情况下很有趣。例如,周期性地生成数据(线)的传感设备,例如在 /dev/ttyUSB0 上。在这种情况下,建议的答案(从文件中读取)仅适用于将流中的数据存储为临时文件并定期处理文件(如果数据在处理时到达怎么办?)。但是更直接的方法(使用管道)可能会更好......
  • 注意cat | grep | awk 可以简化为awk '/^[0-9]+$/ {}' file。另外,你想做什么样的解析?也许根本不需要使用awkwhile read 循环就足够了。

标签: shell curl awk


【解决方案1】:

您可以使用 bash 并避免 awk system 调用:

grep "^[0-9]*$" lines | while read line; do
    curl -s "http://foo.bar/some.php?id=$line" | awk 'do your parsing ...'
done

【讨论】:

    【解决方案2】:

    一个shell循环会得到类似的结果,如下:

    #!/bin/bash
    for f in $(cat lines|grep "^[0-9]*$"); do 
        curl -s "http://foo.bar/some.php?id=$f" | awk '{....}'
    done
    

    执行类似任务的替代方法包括使用 Perl 或 Python 和 HTTP 客户端。

    【讨论】:

      【解决方案3】:

      如果您的文件被动态附加了 id,您可以守护一个小的 while 循环以继续检查文件中的更多数据,如下所示:

      while IFS= read -d $'\n' -r a || sleep 1; do [[ -n "$a" ]] && curl -s "http://foo.bar/some.php?id=${a}"; done < lines.txt

      否则如果它是静态的,您可以将sleep 1 更改为break,它会在没有数据时读取文件并退出,知道如何操作非常有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2011-02-23
        • 2010-12-22
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多