1

我正在尝试使用下载文件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?

4

2 回答 2

3
  1. 您的模式包含 unmatched (
  2. 您需要告诉grep您正在使用 PCRE。
  3. 由于您要重定向STDERR到文件,因此使用管道grep没有多大意义。相反,重定向STDERRSTDOUT然后管道输出。

尝试:

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+)?(?=%))"
于 2013-08-28T08:33:04.587 回答
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
于 2013-08-28T08:40:54.820 回答