2013年3月29日 星期五

強力膠程式

基於俗話說:「正規表示式用的好,下班比較早。」的名言,又用了強力膠搞程式。

最近因為在搞NTP需要檢查輸入變數的IP或者是HOST NAME,需要用到正則表示式幫忙檢查。可是又不太想老老實實的寫程式,一心只想要早點下班,老實說,總歸一句話就是人懶。


sprintf(szCmd, "echo '%s' | grep -q '^\\(\\w\\+\\.\\)\\+\\w\\+$'", strIpHostName);
if(system(szCmd))       {ret=d_NTP_IPURL_INVALID_FORMAT; goto CNCS_EXIT;}


兩行寫完,就下班了~~~XD

這主要還是利用正則表示式幫忙檢查樣式,grep -q 會回應成功或失敗,要system會回0表示樣式對了,當然啦~用system是會比較慢一點,幸好這程式是不太在意效率問題,而我也剛好比較在乎下班時間,所以就這樣搞了。~~XD

原來的shell命令大概像下面這行一樣
echo "www.google.com.tw" | grep -q '^\(\w\+\.\)\+\w\+$'
執行成功或失敗,這樣看不太出來,加上後面那一段,格律對了,就顯示IP/HOST NAME OK
echo "www.google.com.tw" | grep -q '^\(\w\+\.\)\+\w\+$' && echo 'IP/HOST NAME OK'

搭一些牙籤上去讓C語言做出來的程式跑起來,可以運作就收工了,就看起來像是用強力膠黏出來的程式風格,也證明了俗話說的好。

PS.在GNU C上正途是用regcomp這函式,只是這樣程式寫起來就會落落長。。。

2013年3月28日 星期四

sed 與 awk

在script執行過程當中想要改東改西的這種搞法,被稱為串流編輯,而有這種能力的工具,被稱為串流編輯器(stream editer),這當中有兩個工具很好用,就是sed與awk。

這兩個工具在用之前,需要有正規表示式(Regular Expression)的知識,俗話說:「正規表示式用的好,下班就會早。」,它是用來描述字串共同的模式,利用樣式來描述字串的規則,再利用這規則來搜尋、修改等動作。

sed是一種非交談式的串流編輯器,可動態編輯資料,主要是比對樣式,符合就做指定動作。

awk是一種可以處理資料、產生格式化報表的語言。主要是拿來讀取檔案,逐列取出當成紀錄(record),每筆紀錄用欄位分隔符號切開,然後輸出每個欄位的值。

這兩種神兵,用的好,可以讓事情少很多,有些用手敲個老半天,手工打造的表格,用這兩個兵器搞下去,往往一行之內就搞定了。

參考wiki : http://zh.wikipedia.org/wiki/AWK
參考文件:http://www.delightpress.com.tw/bookRead/skns00004_read.pdf
參考網頁:http://linux.vbird.org/linux_basic/0330regularex.php

最近用awk的小心得

$find . -name '*.ko' | awk -F "/" '{printf("%s\t\t->\t\t",$NF)};{for(i=1; i <= NF-1; i++) printf("%s/",$i)};{printf("\r\n")}'

awk的$NF指的是最後一個欄位,這一段命令事先找到資料夾下的.ko檔案,把路徑及檔名丟給awk處理,先印出最後一個欄位,然後加上->符號隔開檔名,最後再用for迴圈組合路徑出來。

結果就是像大概下面這個表一樣。

w1_ds2431.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/w1/slaves/
mmc_core.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/core/
sdhci.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/host/
sdhci-platform-bcm5892.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/host/
sdhci-pltfm.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/host/
mmc_test.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/card/
mmc_block.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/mmc/card/
scsi_wait_scan.ko -> ./target/lib/module/2.6.32.9/kernel/drivers/scsi/
做這個表,主要是把kernel module拷貝到rootfs當中,之前寫的script可以使用這個表列出來的檔案拷貝到rootfs當中,一個一個手工keyin製表,是很勤勞的人在做的事情,實在不符合我的風格,對~我就是個懶人,所以就用了awk把表搞出來,當然使用perl一樣做的到,只是剛好今天換了工具而已。