2013-08-28 63 views
1

我試圖使用wget下載文件,並且想要將進度存儲在日誌文件中。如何使用grep從最後一行提取百分比?

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和不使用sed和awk

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

這可能嗎?

+0

那你到底要到grep? 「最後一行的百分比值」是什麼意思? – aymericbeaumet

回答

3
  1. 您的圖案包含無與倫比的(
  2. 您需要告訴grep您正在使用PCRE。
  3. 由於您將STDERR重定向到一個文件,因此使用管道到grep沒有什麼意義。相反,將STDERR重定向到STDOUT然後管道輸出。

嘗試:

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+)?(?=%))" 
+0

謝謝@devnull該命令的工作原理並不像預期的那樣。在完整下載amit.pdf之前,amit.log文件將變爲空白。我想更新每個進度的文件。 這就是我所做的: 'wget http://unfccc.int/resource/docs/convkp/kpeng.pdf -O amit.pdf 2>&1 | grep -oP「(\ d +(\。\ d +)?(?=%))」>> amit.log' – codef0rmer

+0

你做錯了。管到'tee logfile'然後grep。見上面的編輯。 – devnull

+0

這是一個完美的改變。我想在文件中記錄grep輸出。在這種情況下, – codef0rmer

1

我想你想從命令輸出中提取最後一個百分比能夠發現最終的失敗。

由於@devnull評論,wget詳細輸出寫在標準錯誤,所以我們必須重定向到標準輸出,以便能夠將其管道到grep。

只有使用-o選項才能保持grep的匹配模式。這將打印所有的百分比,但沒有不需要的內容。

然後你可以用tail隔開最後一行。

最後,將其記錄到文件中。


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

包含'wget' * log * *百分數*被髮送到'STDERR',因此到grep的管道在這裏沒有任何影響。 – devnull

+0

你說得對,我解決了這個問題。 – aymericbeaumet

+0

討厭這麼說,但它仍然是壞的。 – devnull