【问题标题】:Capture percentage download from curl in real time从 curl 实时捕获百分比下载
【发布时间】:2016-03-26 17:46:48
【问题描述】:

我正在通过curl 从远程服务器下载文件。脚本将通过Platypus 打包为应用程序,如果脚本输出格式为PROGRESS:\d+\n,则应用程序会显示进度百分比,如here 所述。我试过这样做

curl -O <remote_file> | sed -r 's/[# ]//g;s/^/#/g'

要获得输出百分比,它不起作用。我尝试了另一种方法,如here 所述。那也没用。

如何并行捕获下载百分比和回显文本,例如 PROGRESS:&lt;percentage&gt;\n

P.S 也许是因为它是 Bash 而没有 GNU Sed,所以它没有按预期工作。

【问题讨论】:

  • 您发布的脚本没有任何 GNU sed 特定内容,您使用标准 sed BRE 只是为了摆脱 -r。如果您发布几行示例输入和预期输出,而不是期望人们在网上为它点击,您可能会更幸运。

标签: macos bash shell curl sed


【解决方案1】:

首先,curl 在标准错误输出上输出诸如进度之类的信息,因此您至少必须考虑 STDERR,例如通过使用 2&gt;&amp;1 将其与 STDOUT 合并。

其次,curl 在下载文件时不会产生\n 符号,而是在下载文件时停留在同一行以覆盖显示的进度。因此,您可能必须逐个字符地读取输出流,例如使用IFS= read -r -n1 char

鉴于curl-like 进程字符流,我建议使用保护机制来知道必须保留哪个字符:

  • 如果是数字,我们现在要保留字符。
  • 如果它是 % 符号,我们现在不想再保留字符了

以下代码使用了这些想法,可能适合您的问题。

curl -# -O URL 2>&1 | while IFS= read -r -n1 char; do
    [[ $char =~ [0-9] ]] && keep=1 ;
    [[ $char == % ]] && echo "PROGRESS:$progress" && progress="" && keep=0 ;
    [[ $keep == 1 ]] && progress="$progress$char" ;
done

享受吧!

PS:你当然可以通过连接所有这些代码将它用作单行,但我认为这样更容易阅读。

【讨论】:

  • 这太棒了!谢谢!
  • 有没有可能去掉小数部分只得到整数部分?
  • 当然,只要使用echo "PROGRESS:${progress%,*}"%,* 的意思是“抑制右侧匹配,* 的最短字符串”)
  • 嗯,不,我仍然得到 0.0、0.1 等......这就是我正在运行的:curl -# -O http://java6damn.s3.amazonaws.com/javaforosx.dmg 2&gt;&amp;1 | while IFS= read -r -n1 char; do [[ $char =~ [0-9] ]] &amp;&amp; keep=1 ; [[ $char == % ]] &amp;&amp; echo "PROGRESS:${progress%,*}" &amp;&amp; progress="" &amp;&amp; keep=0 ; [[ $keep == 1 ]] &amp;&amp; progress="$progress$char" ;
  • 哦,我的错,我的 LANG 是法语的...改用 echo "PROGRESS:${progress%.*}"
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2014-04-25
  • 1970-01-01
相关资源
最近更新 更多