天天看點

linux中awk學習小結

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,如需轉載請自行聯系原作者

繼續閱讀