文本處理三劍客之一----------awk

簡單的說awk是一門類似於shell的編程語言,是一種強大的文本處理工具,它的設計思想來源於 SNOBOL4 、sed 、Marc Rochkind設計的有效性語言、語言工具 yacc 和 lex ,當然還從 C 語言中獲取了一些優秀的思想。

它有着屬於自己的獨特的語法表達方式,雖然操作可能會比較複雜,但是語法格式始終都是:

awk [options] 'program' file…

program: {pattern + action}' 或者  'pattern {action}'

pattern部分決定動作語句何時觸發及觸發事件

    BEGIN,END

action statements對數據進行處理,放在{}內指明

    print, printf

分割符、域和記錄

awk執行時, 由分隔符分隔的字段(域)標記$1,$2..$n稱爲域標識。 $0爲所有域,注意:和shell中變量$符含義不同

文件的每一行稱爲記錄,默認的字段分隔符就是空格

省略action,則默認執行print $0 的操作

它的基本用法如下:

awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file ...

-----------------------------------------例題解析-------------------------------------------

1.awk -F: '{if($3>1000){printf "common user:%s\n",$1"}else {printf "root or sysuser: %s\n",$1}}' /etc/passwd

wKiom1nHlXCC9FcYAACYpNuTCTg411.png

2. awk -v test='hello gawk' 'BEGIN{print test}' /etc/passwd

wKioL1nHlVSBgUG3AABl1elfk8k255.png

3.awk -F: '{print name,$1;name="sysuser"}'

 awk -v OFS=":" -F: '{name-"systemuser";print name,$1'} /etc/passwd

 awk -v name="systemuser" -v OFS=":" -F: '{print name,$1}' /etc/passwd

wKiom1nHlY7iU0qIAAAopZp21Rc159.png

wKioL1nHlVnx7KLEAABQh_UrTcM275.png

wKiom1nHlZSQBjasAABDJZtP5qY987.png

4.awk -F: -f awk.txt /etc/passwd 

注意動作可以寫在裏面文本里。

wKioL1nHlWDRnqI0AABCKStynhc239.png

5.awk -F: 'BEGIN{print "username      userid\n------------\n"}{printf "%-20s|%10d\n,$1,$3"}' /etc/passwd

wKiom1nHlb_AHtyeAAFp22HuDBE063.png

6.awk -F: 'BEGIN{print "username-------------uuid"}{printf "username:%15s \t uuid:%d\n",$1,$3}' /etc/passwd

wKioL1nHlYfixG34AACSeOCmbtg146.png

7.awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadminor SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

wKiom1nHlcfQaxqtAABlacsN1jo477.png

8. awk -F" " '/^jkj\>/,/^haha\>/{print $1,$2}' aa

wKioL1nHlbTDd5uZAABvc8XEpzY603.png

9. awk -v test='hello gawk' 'BEGIN{print test}' /etc/passwd

wKiom1nHlqLDCl1HAABknyRFx8o515.png

---------------------------------------------例題進階---------------------------------------

1.seq 10 |awk 'i=!i'

 seq 10 |awk '!i'

wKiom1nHlfSRwN1IAACTHjXPd-Q739.png

2.seq 10 |awk 'i=!i'

 seq 10 |awk '{!i;print !i}'

 seq 10 |awk '{i=!i;print !i}'

wKiom1nHlfTQMGqcAACfRFX20mo507.png

3.seq 10 |awk '{!i}'

 seq 10 |awk '{print !i}'

 seq 10 |awk '!i'

wKioL1nHlbqTfjCiAACU3f7BkdE300.png

4.seq 10 |{i=!i;print i}

wKiom1nHlfTB79wrAABJYvstVy8445.png

5.seq 10 |awk '!(i=!i)'

 seq 10 |awk -v i-=1 'i=!i'

wKioL1nHlbriOUrkAAAyURXjhq4950.png

6.awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else{printf "root or Sysuser: %s\n",$1}}' /etc/passwd

wKioL1nHlbuTF2kmAABRpRt-QWg422.png

7.df -h |awk -F% '^/\/dev/{print $1}' |awk '$NF>=80{print $1 "\t" $5}'

wKiom1nHlgDCWgjtAABxq8f0bGY462.png

8. awk '/^[[:space:]]*linux/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg

wKiom1nHlmuhRDc7AABxDnBZabI415.png

8. awk '/^[[:space:]]*linux/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i);i++}}' /etc/grub2.cfg

wKioL1nHlkHxMoKnAAC_bZgUG9g211.png

9. awk 'BEGIN{i=0;print ++i,i}'

 awk 'BEGIN{i=0;print i++,i}'

wKiom1nHloLDA09PAAA-yhX9PhY207.png

10.比較幾種不同算法的累加和。

wKioL1nHlk2xPch-AAB2NIvQfrw552.png

11.awk -F: '{line[$7]++}END{for(i in line){print i,line[i]}}' /etc/passwd


wKioL1nHlk7QwUyFAACNiPvEUfU601.png

12.awk -v n=0 'n++' aa

 awk -v n=0 '!n++' aa

 awk -v n=0 '++n' aa

 awk -v n=0 '!++n'aa

wKioL1nHllCQ82_7AADMGogg8OU941.png

13.awk  '{print !arr[$0]++}' aa

  awk '!arr[$0]++' aa

wKiom1nHlpHzc1caAACUtoY0lIA803.png

14. awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}'

wKiom1nHlpfTqS_eAACXDRvHBIM958.png

15.awk 'BEGIN{srand();for (i=1;i<=10;i++)print int(rand()*100)}'

wKioL1nHll3SCTygAAA9iqjfwIo707.png

16.比較sub和gsub的區別

wKiom1nHlpeBQS6lAABK14W-9BY577.png

17.netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

wKioL1nHll3hE4SiAADsnIMwwIU228.png

18.awk BEGIN'{system("hostname") }'

awk 'BEGIN{score=100; system("echo your score is " score) }'

wKiom1nHlpjzphUwAAA7sDBM8lg381.png

除了列舉出來的這些用法以外,awk也有自己的腳本語法,可以和shell腳本互相調用,這裏就不一一列舉了,那分享就到這了~~~~~~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章