Unix文本處理工具之awk
Unix命令行下輸入的命令是文本,輸出也都是文本。因此,掌握Unix文本處理工具是很重要的一種能力。awk是Unix常用的文本處理工具中的一種,它是以其發明者(Aho,Weinberger和Kernighan)的名字首字符命名的,是一種基於模式匹配檢查輸入然後將期望的匹配結果處理後輸出到屏幕的文本數據處理工具。
1、awk命令格式
awk ‘模式 {操作}’ 文件1 文件2 ……
awk命令的工作過程是這樣的:對於每一個輸入文件,逐行對其進行檢查,如果該行和awk命令參數的‘模式’部分匹配,則對該行執行命令參數‘{操作}’部分所代表的操作。下面是一個簡單的例子:
[plain]
$cat awk_test.txt
1 a a,b,d,f
2 b alsdjf,apple,kdjf
3 c 163.2.201.1
4 d www.google.com
5 e http://blog.csdn.net/xia7139
$awk 'NR==1{print}' awk_test.txt
1 a a,b,d,f
上面的例子中,用awk命令輸出了awk_test.txt文件的第一行,其中命令的模式部分所用的NR是awk命令的內建變量,代表文件的行號。這樣,便可以對所有行號為1的行進行打印輸出。
2、常用的內建變量
變量 含義
NR 當前處理行的行號
FS 字段分隔,默認為空格或TAB
$n 當前處理行的第n個字段
$0 當前處理行的全部內容 這裡要解釋下字段的含義:在awk的使用中,字段分隔符將文件的一行分隔為各個部分,每一個部分稱為一個字段,從左到右分別為第1個字段,……,第n個字段,其中,第0個字段是指這一整行。字段分隔符如果沒有特殊指定,則默認為空格或tab制表符。
3、幾個例子及其輸出
下面的例子都是對上文中的awk_test.txt文件的操作。
[plain]
按行號操作:
(1)打印文件的1-3行
$awk 'NR==1,NR==3{print}' awk_test.txt
1 a a,b,d,f
2 b alsdjf,apple,kdjf
3 c 163.2.201.1
(2)打印文件的第1行和第3行
$awk 'NR==1||NR==3{print}' awk_test.txt
或者是
$awk '(NR==1)||(NR==3){print}' awk_test.txt
1 a a,b,d,f
3 c 163.2.201.1
(3)只打印奇數行(偶數行)
$awk '(NR%2)==1{print}' awk_test.txt
1 a a,b,d,f
3 c 163.2.201.1
5 e http://blog.csdn.net/xia7139
$awk '(NR%2)==0{print}' awk_test.txt
2 b alsdjf,apple,kdjf
4 d www.google.com
使用正則表達式:
(1)打印包含2的行
$awk '/2/{print}' awk_test.txt
2 b alsdjf,apple,kdjf
3 c 163.2.201.1
(2)打印以com結尾的行
$awk '/com$/{print}' awk_test.txt
4 d www.google.com
指定分隔,輸出指定字段:
(1)打印第1-3行的第一個字段和第三個字段
$awk 'NR==2,NR==3{print $1,$3}' awk_test.txt
1 a,b,d,f
2 alsdjf,apple,kdjf
3 163.2.201.1
(2)指定分隔符為.,輸出第二個字段為csdn的行的第三個字段和整行
$awk -F. '$2=="csdn"{print $3,$0}' awk_test.txt
net/xia7139 5 e http://blog.csdn.net/xia7139