CURL进度条:如何使用grep管道和提取数字?

3
这是我目前为止的内容:

目前为止我所做的:

[my1@graf home]$ curl -# -o f1.flv 'http://osr.com/f1.flv' |  grep -o '*[0-9]*'
####################################################################### 100.0%

我希望使用grep从CURL输出的进度条中仅提取百分比。

我认为我的正则表达式不正确,而且我也不确定这个grep是否会对百分比持续更新产生影响?

我想做的基本上就是让CURL仅给我百分比数字作为输出,而没有其他内容。

谢谢任何帮助。

4个回答

5

使用curl 7.36.0(其他版本也应该适用),您可以按以下方式提取百分比:

curl ... 2>&1 -# | stdbuf -oL tr '\r' '\n' | grep -o '[0-9]*\.[0-9]'

这里的...代表选项/文件名。它输出一系列百分比数字。

Curl在其输出中使用回车符\r,因此您需要使用tr将它们先转换为\n,因为grep是基于行的。您还需要使用stdbuf修改输出缓冲区设置以便在curl输出它们后立即获得百分比数字。


在我的情况下,在grep之前我还需要一个stdbuf -oL。非常好的答案,谢谢! - user1112789

3
您不能通过grep这种方式获取进度信息,那是没有意义的。
curl将进度条写入stderr,因此您必须在grep之前将其重定向到stdout: $ curl -# -o f1.flv 'http://osr.com/f1.flv' 2>&1 | grep 1 | less
结果如下所示:
^M 0.0 %^M######################################################################## 100. 0%^M######################################################################## 100 .0%^M######################################################################## 10 0.0%
您是希望将连续的数字流重定向到其他地方吗?还是您只希望获取某个时间点的数字?
如果是前者,这种部分有效地处理小文件:
$ curl -# -o f1.flv 'http://osr.com/f1.flv' 2>&1 | sed  's/#//g' -
 100.0%                                                                    0.0%

但是对于大文件来说这个命令没有用。输出只有在下载完成后才会打印出来,这可能是因为curl似乎向终端发送了^H字符。或许有更好的sed方式可以解决这个问题,但我不抱太大希望。

$ curl -# -o l.tbz 'ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2009/06/2009-06-02-05-mozilla-1.9.1/firefox-3.5pre.en-US.linux-x86_64.tar.bz2' 2>&1 | sed 's/#//g' -
 100.0%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

啊,我明白了,重定向输出以便我能够真正看到它。我希望只是像你说的那样提取数字(前者)。我尝试了上面的方法,但只有在达到100%时才会得到输出 - 也许我需要一个更大的文件才能真正看到进度的变化? - Abs
Curl的输出是为人类阅读而设计的,而不是为计算机阅读 - 这就是为什么在使用grep时格式很糟糕的原因。您可以尝试使用wget --progress = dot并计算点数,但这样也不是百分比。或者也许您可以只计算curl输出中的#号。至少您可以获得5-10%的准确度,或者无论终端中有多少个#符号,对吧? - Mark Rushakoff
你说得对,也许数哈希值会更好些。由于某种原因,我的主机屏蔽了wget,所以我不能使用它。之前我提出的问题得出的共识是,如果不能使用wget,那么CURL是下一个最好的选择。应该补充说明其他选项中哪个有易于解析进度的简便方法!! - Abs

3

试试这个:

curl source -o dest -# 2> tmp&

grep -o ".....%" tmp | tail -n1

0

你需要在正则表达式中使用 .* 而不是 *。

grep -o '.*[0-9].*'

这会捕获所有文本,所以也许可以尝试:

grep -p '[0-9]+'

我需要将其进一步管道传输到echo中才能实际看到grep的结果吗? - Abs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接