如何使用grep从最后一行中提取百分比?

时间:2013-08-28 08:25:14

标签: bash wget

我正在尝试使用wget下载文件,并希望将进度存储在日志文件中。

wget http://unfccc.int/resource/docs/convkp/kpeng.pdf -O amit.pdf 2> amit.log

这是wget的回报:

Connecting to unfccc.int (unfccc.int)|62.225.2.55|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 76721 (75K) [application/pdf]
Saving to: `amit.pdf'

 0K .......... .......... .......... .......... .......... 66% 2.29M 0s
50K .......... .......... ....                            100% 9.41M=0.02s

2013-08-28 12:24:32 (3.06 MB/s) - `amit.pdf' saved [76721/76721]

我想使用grep从最后一行获取百分比值。这就是我使用的上述命令,它不起作用:

| grep "(\d+(\.\d+)?(?=%)" amit.log

是否可以只使用grep而不使用sed和awk?

2 个答案:

答案 0 :(得分:3)

  1. 您的模式包含不匹配的(
  2. 您需要告诉grep您正在使用PCRE。
  3. 由于您要将STDERR重定向到文件,因此使用管道grep会没有多大意义。而是将STDERR重定向到STDOUT,然后管道输出。
  4. 尝试:

    grep -oP "(\d+(\.\d+)?(?=%))"
    

    如果您想使用烟斗,请说:

    wget http://unfccc.int/resource/docs/convkp/kpeng.pdf -O amit.pdf 2>&1 | grep -oP "(\d+(\.\d+)?(?=%))"
    

    编辑:如果需要将stderr记录到文件中,请说:

    wget http://unfccc.int/resource/docs/convkp/kpeng.pdf -O amit.pdf 2>&1 | tee amit.log | grep -oP "(\d+(\.\d+)?(?=%))"
    

答案 1 :(得分:1)

我认为您希望从命令输出中提取最后一个百分比,以便能够发现最终的失败。

@devnull所述,wget详细输出是在标准错误上写的,因此我们必须将其重定向到标准输出才能将其传递给grep。

只能使用grep选项保留-o匹配模式。这将打印所有百分比而没有不需要的内容。

然后,您可以使用tail隔离最后一行。

最后,将其记录到文件中。


wget http://unfccc.int/resource/docs/convkp/kpeng.pdf -O amit.pdf 2>&1 | grep -o '[0-9]\+%' | tail -1 > amit.log