awk與sed本身都是一個完整的程式設計語言,可以用來友善的處理文本,awk處理列。
awk正常的結構: cat tmp.txt | awk 'BEGIN{}{}END{}' --帶有表頭,帶有中間的處理過程,帶有結尾--
常用用法:cat tmp.txt|awk '{print $1}' --tmp.txt中字段已空格分隔,$0顯示整行,$1表示第一個域,$NF最後一個,$NF-1倒數第二個域,預設的分隔符是空格--
1、域分隔符是:
cat /etc/passwd|awk -F':' '{print $1,$NF}' --指令行模式下,-F參數可修改輸入的分隔符,即處理檔案時的分隔符,該指令為以:分隔passwd檔案,列印第一個域和最後一個域,輸出字元預設已空格分隔--
cat /etc/passwd|awk -F':' '{print $1$NF}' --輸出第一個域和最後一個域,之間無空格,--
cat /etc/passwd|awk -F':' '{print $1“____”$NF}'--輸出第一個域和最後一個域,之間分隔為____,--
2、比對行列印域
例檔案tmp.txt:
11 aa 666
22 bb 777
33 cc 888
指令:
cat tmp.txt|awk '/bb/{print $0}' 結果:22 bb 777 --内容比對到bb的行列印--
cat tmp.txt|awk '/bb/{print $3}' 結果:777 --内容比對到bb的行,列印第三個域,預設分隔符為空格--
cat tmp.txt|awk '$2~/b/' {print $3}結果:777 --第二個域可以比對b的行,列印第三個域,注意有空格--
可以減少一次grep對檔案的查找
3、判斷列印
cat /etc/passwd|awk -F':' '{if($1=="bill")print}' --第一個域等于字元串bill,列印--
4、數組
例檔案
search 111
search 222
cm 333
search 444
cat tmp.txt |awk '{a[$1]++}END{for(i in a)print i,a[i]}'
結果:
cm 1
search 3
a[$1]為一個資料,a[$1]++記錄不同資料出現次數
5、awk比對到指定的字元串并列印該字元串所在的域(列數)
格式:
awk '/行比對串/ {for(i=1;i<=NF;i++) if($i ~ /字元串/) print $i i}' $filename
awk '/行比對串/ {for(i=1;i<=NF;i++) if($i ~ /(字元串1|…|字元串n)/) print $i i}' $filename
例:
awk '/is/{for(i=1;i<=NF;i++) if($i ~ /is/) print $i i}' try.pl
本文轉自 00_yatou 51CTO部落格,原文連結:http://blog.51cto.com/ql0722/1614752,如需轉載請自行聯系原作者