【问题标题】:wget gives error while calling it inside AWK using two-way I/Owget 在使用双向 I/O 在 AWK 中调用它时出错
【发布时间】:2012-11-22 13:31:34
【问题描述】:

我需要在awk 脚本中获取wget 调用的输出。但是,由于某种原因,当我使用 two-way I/O 时,wget 调用失败。

我的尝试是(以 MWE 形式):

使用循环捕获多行:

echo http://www.del-rio.net/images/festival/medium/2000_0516_Ellen_Burstyn_1274-1-4.jpg | awk '{
  cmd = "wget -t 1 $0";
  while ( (cmd | getline line) > 0 ){
    result = result " " line;
  }     
  print result;
  close (cmd);
 }'

并且使用单行。这个我尝试使用和不使用非详细选项,因为带有-nv 选项的 wget 调用仅返回一行。

 echo http://www.del-rio.net/images/festival/medium/2000_0516_Ellen_Burstyn_1274-1-4.jpg | gawk '{
  "wget -t 1 -nv $0" | getline line;   
  print line;
}'

但是,在这两种情况下,它都会停止并给出消息:

--22:09:09--  http://sh/
          => `index.html' 
Resolving sh... failed: Host not found.

我做错了吗?或wget 在这种管道模式下不起作用?在这种情况下,如何在awk 脚本内的变量中获取调用结果。

【问题讨论】:

  • 试试 echo 'http://....' | gawk ...祝你好运。
  • @shelter 没用,结果一样...

标签: awk pipe wget


【解决方案1】:

将 $0 移到引号之外,即这样做:

"wget... " $0

而不是这个:

"wget... $0"

不相关但:摆脱所有那些使您的脚本混乱的空语句(尾随分号)。

【讨论】:

  • 现在我将$0 移到wget 运行的引号之外,但在result 变量中仍然没有输出,它是空的
【解决方案2】:

主要问题是wget 输出被重定向到标准错误而不是标准输出。因此,getline 永远不会捕获它(据我所知)。

所以我的解决方案是将日志输出重定向到标准输出,然后处理该行。

正如Ed Morton 所指出的,主机未解决的问题是引号内的$0 变量。

因此,将所有内容放在一起就可以这样工作

echo http://www.absolutely.net/wenn/handy_manny_05_wenn5360250.jpg  | awk '{
  cmd = "wget -t 1 " $0 " 2>&1"
  while ( (cmd | getline line) > 0 ){
    result = result " " line
  }
  close(cmd)
  print "the result: " result
}'

【讨论】:

  • 别忘了close(cmd)。我确实想知道您为什么要这样做,而不是在 awk 之外调用 wget,但我猜这一定是更大脚本的一小部分。
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多