iT邦幫忙

12

[好用的 Script] 老工具 Perl, AWK, SED的還不錯的資源

簡介 Perl, AWK, SED 這幾個老工具的還不錯用的資源。
為何要介紹這些老工具?
在眾多新程式語言的環境下,老工具也是可以有其便利之處。
常果在CLI之下操作、用鍵盤的機會比用滑鼠Click的機會更多的話,
隨手可抓來用用的老工具,只是可用最少力氣來完成較簡單的工作。
在此先以簡單的例子說明:
抓網頁中特定連結
雖然 wget 可當砍站的工具,但真的沒有必要,
所以通常在 wget 或 curl 一個網頁後,想要把裡面所有的 URL 給抓出來,
就用這個 Perl FAQ 中的 How do I extract URLs? 範例:

#!/usr/bin/perl -n00
# qxurl - tchrist@perl.com
print "$2\n" while m{
        < \s*
  A \s+ HREF \s* = \s* (["']) (.*?) \1
        \s* >
}gsix;

我命名為 qxurl.pl (Quick eXtract URL),後面接個檔名就馬上抓出裡面的 URL 出來。
然後再 grep 出要抓的的特定字眼,成為一個列表,再把這個列表餵給 wget 。
以IT邦幫忙首頁為例,若我只想要抓「即將到期的文章列表」,可利用以下指令:

curl ithelp.ithome.com.tw | qxurl.pl | grep tag=hp.ae | awk -F'?' '{print "http://ithelp.ithome.com.tw"$1}' > ae.txt

然後 wget -i ae.txt 就只把即將到期的文章給抓下來。

有關 Perl 的好文
Perl 的書及資源很多,不需多言,但在 Randal L. Schwartz 的網頁中,
有蒐集他在一些雜誌寫 Perl 相關的 專欄文章
而其中的 Unix Review 的文章與系統管理較有關,是蠻好的參考資料。

AWK
如果從要處理的資料上,有較清楚明顯又一致的分欄符號時,AWK 就很方便處理。
我常用的功能很簡單而單純:
一、有時需要幫忙處理 Excel 上的資料處理,
就複製該工作表,貼到 Linux 的 vi 純文字之中,
用 AWK 先檢查一下所貼的每一行是否都是相同的欄位數後,
因分欄正確後,再用 perl 去處理稍麻煩的最後輸出。

二、一些檔案放在web的目錄下,做出簡單的index.html
因為並不啟用 web server 的 autoindex 功能,
就利用
ls | awk '{print ""$0""}' > index.html

做出該目錄的檔案連結頁面。

上述的兩例是 AWK 的小小小小功能的使用,
還沒有用到號稱強大的計算統計的功能;
會用到計算功能,比較可能在做 log analysis 時用到;
在 squid proxy 的網站中,就有幾個簡易的 log 分析程式,
就是 AWK 的 script。

簡潔的 AWK 的介紹教學:
AWK: The Linux Administrators' Wisdom Kit
http://www.oracle.com/technology/pub/articles/dulaney\_awk.html

較詳細的 AWK 教學
An Awk Primer
http://www.vectorsite.net/tsawk.html

在 Introduction to Gawk 裡
http://web.cecs.pdx.edu/~timm/dm/gawk101.html
有做 AWK 與其他程式語言的比較,
及說明何時用 AWK 的時機。

SED
若所要處理的資料,沒有一定的分欄符號,
卻有一定的樣式或 pattern ,就可用 SED 來做;
只是在command line 中,若要同時多組 back reference 的時候,
一堆的斜線、反斜線、括號,看起來就會有點頭大…

SED 的介紹及教學
Sed - An Introduction and Tutorial
http://www.grymoire.com/Unix/Sed.html

一行搞定的 SED 指令範例
HANDY ONE-LINERS FOR SED
http://student.northpark.edu/pemente/sed/sed1line.txt

老工具偶有用處,但不拘泥一定用什麼
上述的 SED, AWK, Perl,都算是老工具,
Perl是可以完全頂替前兩者的工作,
或者要做一些較複雜的處理,Perl是較好的選擇,彈性也更大。
只是在一些 CLI 的環境中,或沒那麼複雜的資料要處理時,
老老的工具,也是有一定的較方便使用時機。

而現在真正比較要處理稍複雜的議題時,
像怎麼去 parse RSS, XML,或去抓某網頁的某元件,
用這些老工具去做就真的是自找麻煩。
較新的程式語言及其豐富而廣泛的相關套件,
簡單一裝,幾行的語法就搞定。
(當然,最前面的 抓網頁中特定連結 範例,
許多套件也都可做到,只是看既然有現成的工具,
及可以不用花那麼大的代價完成,也是還不錯的選擇)

但也不要用 PHP 來當作 shell script 的工具來用,
曾看到廠商在我們的舊機器裡的程式,
竟然是在 cron 的時候,用 PHP 來處理 log 的統計資料;
我雖沒有什麼數字根據,但主觀印象就覺得其效能有待榷之處。

條條大路通羅馬、不管黑白貓,抓得到老鼠就是好貓,
管你什麼作業系統、程式語言、GUI、CLI,
這些都只是
幫助個人可以用不同的思路去解決問題、
或者來延伸個別的創意而已,
畢竟只要能上手完成任務,做得大家都高興就好了。


0
cooch
iT邦研究生 3 級 ‧ 2009-06-21 08:40:56

還有 grep 啦!

awk , sed , grep 3個人是好朋友ㄡ!

0
wordsmith
iT邦高手 1 級 ‧ 2013-05-03 12:26:19

忙 這些工具真是經得起時代的考驗啊~

也推grep!!

0
fillano
iT邦超人 1 級 ‧ 2013-05-03 13:35:31

每一台經手的windows機器,我都在上面裝gnuwin32...就算只是要看開發時產出的log,tail還是最好的工具...

我要留言

立即登入留言