2010年7月13日 星期二

What can shell script do?

最近暑期生來到這裡,讓整個地球所變得熱鬧且充滿生氣。其實我一直很想作一些bash的教學,不過礙於環境,所有的教學跟經驗,我希望能把握僅存的時間寫成教學文章,讓年輕的地震學家或地球物理學家能夠透過學習bash,充分體驗bash之美。

今天只是牛刀小試一番,我們來看看shell script的威力。假設我今天瀏覽一個網頁,該頁面上充滿著美麗的圖片(當然,圖片的內容是風景或是美女...筆者沒有權利過問@_@);以 這個頁面為例,我們要抓下裡面風景的圖檔其實不需要任何工具,一個終端機就行了。檢視這個頁面的原始碼,搜尋jpg或是png,你大約可以發現你要的圖片是位於哪個區塊。
我把選取的範圍另存成一個文字檔之後(temp.txt),就可以利用shell script來取得我們要的東西。 讓我們來思考一下這個東西。我們要得東西主要是http://blablabla.com/XXX.jpg這樣的格式,但是其他累贅的字串實在太多,而且大多處於同一行的狀態,這個時候用awk不太適合,先把sed請出來用:

cat temp.txt | sed 's/></\n/g'
我的目的是把每個網址列都盡量變成獨立的一行,把字串裡面所有的
><
符號都變成換行字元符號。 關鍵字串已經獨立成一行一行了,此時grep以及awk就可以雙劍合璧:
cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}'
我利用pipe在延續剛剛的命令,取出包含http的字串後,發現關鍵字串在第二的colume,用awk取值非常容易。 我們要的網址列已經呼之欲出了,再做個最後的努力吧!
cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}' | awk -F= '{print $2}' | uniq

我們要的網址列已經乖乖的呈獻在我們面前。讓我們愉快的把他寫成shell script當成送自己的第一份禮物吧!

  1. #!/bin/bash
  2. ## This script is going to help you to download pictures automatically from web.
  3.  
  4. ## pictures: the real link we need
  5. pictures=$(cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}' | awk -F= '{print $2}' | uniq)
  6.  
  7. ## start to download:
  8. for files in $pictures; do
  9.     wget -c $pictures
  10. done

我們要的圖片就這樣下載下來了。希望這篇小文能讓你對shell script感到興趣,並在研究的路程上處理繁複的data能更得心應手,事事都以shell為想法來解決問題。

Share