2013年10月24日 星期四

[Linux] 資料處理工具_data porcessing tools_(awk, sed)


若對正規表示法有一些基本的了解,那在有兩個功能在資料處理上特別值得一提,就是 awk & sed,基本上這兩個功能都是在分析取用的資料、統計,並進行匯整後以類似報表的方式輸出。


awk

Linux 內建的資料處理工具,以「行」為單位,將每行中的資料分為數個「欄位」來處理。

使用方法如下:
[root@www ~]# awk '條件類型1{動作1} 條件類型2{動作2} ...' filename

大括號{}內設定要對資料進行處理的動作,以下皆引用鳥哥哥的範例:
[root@www ~]# last -n 5 <==僅取出前五行
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root tty1 Fri Sep 5 14:09 - 14:10 (00:01)

若僅要取出帳號與登入者的IP,且用[tab]將他們隔開,結果如下:
[root@www ~]# last -n 5 | awk '{print $1 "\t" $3}'
root 192.168.1.100
root 192.168.1.100
root 192.168.1.100
dmtsai 192.168.1.100
root Fri

awk程序處理流程:
1. 先讀入第一行,將第一行的資料分別填入 $0, $1, ...等變數中。( ※ 這邊要注意的是,第1欄的資料是從$1開始放起,$0代表的是一整列的資料)
2.再依據 '條件類型' 判斷是否執行大括號{}內的動作
3. 執行完所有的條件及動作後,再進入下一行,並重複從第一步驟開始,直到全部資料讀取完畢

awk內建變數:
1. NF:每一行($0)擁有的欄位總數
2. NR:目前awk所處理的是第幾行的資料
3. FS:目前欄位的分隔字元(預設空白)
範例如下:
[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
root lines: 1 columns: 10
root lines: 2 columns: 10
root lines: 3 columns: 10
dmtsai lines: 4 columns: 10
root lines: 5 columns: 9

註:awk應用功能很多,且還能依據awk的條件式輸出類似報表的格式,詳細的其他應用待實作後再分別說明心得,參考資料說明很詳細,有興趣的人可以詳讀。
參考資料:
[1] http://linux.vbird.org/linux_basic/0330regularex.php#awk
[2] http://blog.xuite.net/mb1016.flying/linux/28111008-linux+shell+awk+%E8%AA%9E%E6%B3%95


sed

「本身也是一個管線命令,可以分析standard input,而且還可以對資料進行取代、刪除、新增、擷取...等」(引述鳥哥哥的話)

使用語法如下:
[root@www ~]# sed [-nefr] [動作]

參數說明:(待補畫面)
1. -n:使用此指令僅被 sed處理過的那一行才會被列出
2. -e:直接在指令列進行sed的動作
3. -f: 將sed的指令動作寫入一個檔案內,再 -f filename 去執行檔案內的動作
4. -r: 使 sed 支援延伸正規表示式。預設是基礎正規表示式
5. -i: 直接修改讀取的檔案內容,而不會由螢幕輸出結果
※這邊要注意的是,通常使用 -i 時會「sed -i '.bak' 's/ME/AAA/g' Makefile」這樣表示,會先將原檔案備份,已備修改後發現有誤要復原。

動作說明:[n1[,n2]] function
n1, n2: 代表「選擇進行動作的行數」,(例:要對檔案內10~20行進行動作,則「10,20[動作])

function:(待補畫面)
a:新增,可接字串,出現在目前選定範圍的下一行
c:取代,可接字串,取代n1~n2之間
d:刪除
i :插入,可接字串,出現在目前選定範圍的上一行
p:列印,將選定範圍的資料印出,通常與「sed -n」一起使用
s:取代,可直接進行取代,通常搭配正規表示法一起使用

※這部分的相關應用也會再補上,有興趣的人可以先詳閱參考資料喔!

參考資料:
[1] http://linux.vbird.org/linux_basic/0330regularex.php#sed
[2] http://lalakiwe.myweb.hinet.net/Documents/sed/sed_2.html

沒有留言:

張貼留言