【问题标题】:curl with awk get last line failscurl with awk get last line 失败
【发布时间】:2014-11-30 04:40:23
【问题描述】:

我有以下 curl + awk 命令,只要数据只有 4 行,它就可以工作,但是,行数可以改变,我被困在这一点上。本质上,curl + awk 应该只抓取始终以等号 (=) 结尾的最后一行,以及该行内第二组数字的前 3 位。

curl "http://www.nws.noaa.gov/view/validProds.php?prod=TAF&node=KOKX" |grep --after-context=2 "KLGA " |head -3 |tail -1 |awk '{print substr($2,0,4)}'  

【问题讨论】:

  • 发布示例输入和预期输出..

标签: curl awk


【解决方案1】:

如果我正确解释了您的要求,这就是您想要的。这将选择以等号结尾的“KLGA”之后的第一行。对于该行,它会打印第二个字段的前三个字符:

curl -s "http://www.nws.noaa.gov/view/validProds.php?prod=TAF&node=KOKX" | awk '/KLGA/{f=1} f && /=$/ {print substr($2,1,3);exit}'

工作原理

curl 的输出被馈送到这个awk 命令:

awk '/KLGA/{f=1} f && /=$/ {print substr($2,1,3);exit}'

一步一个脚印:

  • /KLGA/{f=1}

    这会查找包含“KLGA”的行并将标志 f 设置为 1。

  • f && /=$/ {print substr($2,1,3);exit}

    如果标志f 非零且此行以等号结尾,则执行以下两条命令:

    1. print substr($2,1,3)

      这会打印第二个字段的前三个字符。

    2. exit

      因为我们忽略了文件的其余部分,所以退出awk。

总之,代码查找包含KLGA 的行。一旦通过设置f==1 找到该行,它就会查找以等号结尾的第一行。在这一行中,它从第二个字段中提取前三个字符并打印出来。

【讨论】:

  • 感谢您的帮助。但是当我运行它时出现错误。 curl: (23) 写入正文失败 (363 != 1356) 查看页面格式:link
  • @jeffschips “我遇到了一个错误” 计算机处理细节。究竟你收到了什么错误?我只是从这里的答案中复制了命令,将其粘贴到命令行:它从 NASA 下载并解析输出而没有错误。如果您遇到错误,您需要告诉我它是什么。
  • 我的立场是正确的!如果我将数据通过管道传输到具有 > into_a_file.txt 的文件中,它可以很好地捕获数据。然而,当打印到屏幕上时它会变得很乱。 . .不知道为什么。我收到的错误包含在我上面的评论中: curl: (23) Failed writing body (363 != 1356)。但正如我跟进的那样,它只会在屏幕上产生该错误,而不是当我通过管道输入文件时,这实际上是我需要的。
  • curl 喜欢显示进度条。这就是你说的“乱七八糟”吗?如果是这样,请将-s 选项添加到curl 以使其静音。
  • 所以我试图理解流程:将标志设置为 1 完成了什么?如果以这种方式完成,这是否意味着逻辑一直流动,直到等号和 substr 向后提取数据?谢谢
猜你喜欢
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2011-04-10
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多