6.03.2016

RE (Regular Expression), "awk" command

在上一篇的筆記之中,記下了可以搭配RE的Linux指令"sed"的用法─在不修改原始檔案的狀況下,執行動態編輯。

這一次要記的是另一個指令:"awk"!這個工具善於處理已整理過、格式化的資料,如ps aux、/etc/passwd等等。它的基本格式如下:awk '樣式命令{動作}' "檔案"

a) awk預設的欄位分隔符號是空白 (Space)或是TAB鍵

b) $1, $2, $3代表該行的第1欄位、第2欄位、第3欄位;$0則是代表整行資料

c) awk的內建變數:
NF:每一行 ($0)所擁有的欄位總數。
NR:目前是處理第幾行的資料。
FS:目前的分隔字元,預設值是空白 (Space)鍵。

[root@localhost ~] awk "/root/" /etc/passwd
[root@localhost ~] awk '/root/' /etc/passwd
在檔案中尋找含有"root"字串的行。

[root@localhost ~] awk '{print $1,$4}' /proc/net/arp
僅顯示檔案中每一行的第1欄位和第4欄位。

[root@localhost ~] awk '/eth/{print $2,$10}' /proc/net/dev
在檔案中僅顯示含有"eth"字串的那一行的第2欄位和第10欄位。

[root@localhost ~] awk -F ':' '/root/{print $6,$7}' /etc/passwd
在檔案中尋找含有"root"字串的行,且欄位分隔符號為':',並秀出第6欄位和第7欄位。

[root@localhost ~] awk -F ':' 'BEGIN{OFS="+++"}/root/{print $6,$7}' /etc/passwd
[root@localhost ~] awk -F ':' '/root/{print $6 "+++" $7}' /etc/passwd
輸出結果同上,但把輸出結果的欄位分隔符號變為"+++"。

[root@localhost ~] awk -F ':' '/eth.|ppp.|wlan./{print $1}' /proc/net/dev
在檔案中,尋找含有"eth."、或"ppp."、或"wlan."字串的行,且欄位分隔符號為':',僅顯示第1欄位。
此一指令的功能在尋找網路設備的名稱。

[root@localhost ~] awk -F ':' '/root/{print NR "," NF}' /etc/passwd
在/etc/passwd檔案中,欄位分隔符號為':';尋找含有"root"字串的行,秀出「含有"root"的字串是在第幾行」和該行有幾個欄位,分隔符號為','。

[root@localhost ~] awk '{FS=":"}$3<10{print $0}' /etc/passwd
在檔案中,欄位的分隔符號為':',第3欄位的值小於10,把整行秀出來!

沒有留言:

張貼留言