Re: [問題] 要做個自動抓基金淨值功能
※ 引述《theater.bbs@ptt.cc》之銘言:
> ※ 引述《Storm.bbs@bbs.sayya.org (風)》之銘言:
> : 還可以用 gawk 合併 grep 和 sed 的部分:
> : wget -O - http://fund.cnyes.com/Detail/historicalNav/B08,020.html \
> : |awk '/個別基金:start/
> : {print gensub(/.*"pe r">([0-9]+\.[0-9][0-9])<\/td>.*/,"\\1","") > "a.txt"}'
> : 或
> : wget -O - http://fund.cnyes.com/Detail/historicalNav/B08,020.html \
> : |awk '/個別基金:start/
> : {print gensub(/.*"pe r">([0-9]+\.[0-9][0-9])<\/td>.*/,"\\1","")}' > a.txt
> hi
> 執行時出現
> .
> 這是是一堆html
> .
> 2010-10-03 13:43:00 (28.2 KB/s) -- 已儲存 ‘-’ [72584/72584])
> --2010-10-03 13:43:00-- http://%5C/
> 正在查找主機 \... 失敗: Host not found。
> wget: unable to resolve host address `\'
> FINISHED --2010-10-03 13:43:02--
> Downloaded: 1 files, 71K in 2.5s (28.2 KB/s)
> D:\Program Files\GnuWin32\bin>|awk '/個別基金:start/
> 這個時候不應有 |。
> 我把|刪掉再次執行出現
> D:\Program Files\GnuWin32\bin>awk '/個別基金:start/
> awk: '/個別基金:start/
> awk: ^ invalid char ''' in expression
> 麻煩替我解答一下 感謝
會出現你執行的錯誤的原因是,我寫的指令其實是全部串起來,要全部寫在同一列。
在 UNIX 上,「\」可以把一列指令分成好幾列來寫,「\」是告訴 shell 說這列指令還
沒結束,要接到下一列去。同樣的,因為在 UNIX shell 下,單引號要對稱,所以 awk
後面給的參數部分,第一列的單引號「'」沒有成對,因此 shell 會知道第二列的內
容是延續上一列的。
不過在 Windows 上,如果你不是使用 cygwin 或者使用 MinGW 或 GnuWin 的 bash
的話,Windows 的 cmd.exe 對「\」的解讀會和 UNIX 的 shell 差異頗大,把「\」
當成 wget 的參數丟給 wget,所以 wget 才會回應說「unable to resolve host
address `\'」。還有,顯然 cmd.exe 對沒有對稱的單引號的處理也和 UNIX shell
不同,因此 awk 看到給他的參數只有「'/個別基金:start/」,包含一個不對稱沒有
封閉的單引號,回應「invalid char ''' in expression」告訴你那個單引號有問題。
因此,最簡單的解決辦法是,把整段三列全部寫在同一列(記得要去掉 "\") 去執行。
"|" 符號是所謂的 pipeline,這個部分 MS 從 DOS 時代的 command.com 到 Windows
的 cmd.exe 都有抄到 UNIX shell 的這個功能,所以應該不會有問題。
所以你在 cmd.exe 上執行這些指令時,應該是類似這樣子:
D:\Program Files\GnuWin32\bin> wget -O - http://fund.cnyes.com/Detail/historica
lNav/B08,020.html |awk '/個別基金:start/ {print gensub(/.*"pe r">([0-9]+\.[0-9]
[0-9])<\/td>.*/,"\\1","") > "a.txt"}'
總之應該整段指令一次執行,wget 和 awk 中間只有 "|" 隔開。手邊目前沒 Windows
的機器可以用來截圖,所以先這樣吧!加油啦!
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: c-76-111-34-186.hsd1.ga.comcast.net
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章