1.其它編程語言數組的下標一般從0開始,awk中數組下標默認從1開始,也可以從0開始設置:
awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";print huluwa[1]}' 二娃 awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";print huluwa[4]}' 第二條命令沒有內容輸出
2.在awk中,元素的值設置為"空字符串"是合法的,所以不能用元素值是否為空,判斷該元素是否存在於數組中.
當一個元素不存在於數組時,引用該元素,awk會自動創建這個元素,為這個元素賦值為空字符串, 所以引用一個不存在於數組的元素時,這個元素已經被賦值了,也就是已經存在了. awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]=""; if(5 in huluwa){print "第6個元素存在就能看到這句話"}}'
3.使用語法if(下標 in 數組名),可以判斷數組中是否存在對應的元素.
awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]=""; if(!(5 in huluwa)){print "第6個元素存在就能看到這句話"}}' 第6個元素存在就能看到這句話
4.用delete可以刪除數組中的元素,也可以刪除整個數組
awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃"; huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa["yiwa"];print huluwa["yiwa"]}' 大娃 awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃"; huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa;print huluwa["yiwa"]}' 大娃
5.兩種for循環
awk 'BEGIN{huluwa[1]="大娃";huluwa[2]="二娃";huluwa[3]="三娃"; huluwa[4]="四 娃";for(i=1;i<=4;i++){print i,huluwa[i]}}' 1 大娃 2 二娃 3 三娃 4 四娃 awk 'BEGIN{ huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";huluwa["sanwa"]="三 娃"huluwa["siwa"]="四娃";for(i in huluwa){print i,huluwa[i]} }' siwa 四娃 yiwa 大娃 erwa 二娃 sanwa 三娃
發現數組其實是無序的,可以把它當成python中的字典.
6.數組應用1:
awk 'BEGIN{ a=1; print a; a++; print a}' 1 2 當字符串或者空字符串參與運算時,將被當做數字0. awk 'BEGIN{ a="test"; print a; a++; print a; a++; print a}' test 1 2 awk 'BEGIN{ a=""; print a; a++; print a; a++; print a}' 1 2 引用數組中一個不存在的元素時,元素被賦值為空字符串,參與運算時被當做0使用 awk 'BEGIN{ print a["ip"]; a["ip"]++;a["ip"]++; print a["ip"]}' 2
統計ip出現的次數:

# cat test10 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.12 192.168.1.3 192.168.1.3 192.168.1.2 192.168.1.4 192.168.1.12 192.168.1.1 # awk '{count[$1]++} END{for(i in count) {print i,count[i]} }' test10 192.168.1.12 2 192.168.1.1 2 192.168.1.2 2 192.168.1.3 3 192.168.1.4 1
7.數組應用2:

# cat test4 zhangsan lisi wangwu zhaoliu zhouqi zhangsan wangwu lisi zhaoliu # awk '{ for(i=1;i<=NF;i++){a[$i]++} } END{ for(j in a){print j,a[j]} }' test4 zhaoliu 2 zhangsan 2 wangwu 2 lisi 2 zhouqi 1
8.數組應用3:

# cat a.txt 李四|000002 張三|000001 王五|000003 趙六|000004 # cat b.txt 000001|10 000001|20 000002|30 000002|15 000002|45 000003|40 000003|25 000004|60 # awk -F '|' 'NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}' a.txt b.txt # awk -F "|" 'NR == FNR{a[$2]=$1;next}{print a[$1],"|",$0}' a.txt b.txt # awk -F "|" 'NR == FNR{a[$2]=$0;next}{print a[$1]"|"$2}' a.txt b.txt 張三 | 000001|10 張三 | 000001|20 李四 | 000002|30 李四 | 000002|15 李四 | 000002|45 王五 | 000003|40 王五 | 000003|25 趙六 | 000004|60
解釋說明:
在NR == FNR時,也就是在處理前四行時,將數組的格式變成:
a={"000002":"李四","000001":"張三","000003":"王五","000001":"趙六"},
處理剩下的行時,用a[$1]去找姓名,再加上每一行內容就是想要的內容.
9.內置函數(用到時再研究)
常用的算數函數--rand、srand、int; 字符串函數--sub、gsub替換某些文本,length函數獲取指定字符串長度; index函數獲取的到指定字符串在整個字符串中的位置; split函數可以將指定的字符串按照指定的分隔符分割,將每段內容賦值到數組中,從而動態的創建數組.
10.三元運算
三元運算語法:條件?結果1:結果2
使用變量usertype接收了三元運算后的返回值,當條件成立時,usertype被賦值為"系統用戶",反之為"普通用戶" awk -F: '{ usertype=$3<500?"系統用戶" : "普通用戶"; print $1,usertype}' /etc/passwd 表達式1?表達式2:表達式3 awk -F: '{$3<500?a++:b++}END{print a,b}' /etc/passwd
11.打印奇偶行

# cat test11 第 1 行 第 2 行 第 3 行 第 4 行 第 5 行 第 6 行 第 7 行 第 8 行 第 9 行
a.當使用了模式時,如果省略了對應的動作,會默認輸出整行.
awk '$2>7' test11 第 8 行 第 9 行
b.awk中,0或空字符串表示'假',非0值或非空字符串表示'真'.
# awk '1{print $0}' test3 hello helllo # awk '1' test3 hello helllo # awk '0' test3 什么也不會輸出 # awk '!0' test3 0取反,即為真 hello helllo # awk 'i=1' test3 hello helllo
c.awk開始處理第一行,i被初始化,值為空,模式為假,所以i=!i,是將取反后的值又賦給了i,
此刻i的值為真,在awk處理第一行文本時i為真,且省略了動作,就會打印第一行內容;
在處理第二行時,將在第一行時為真的i取反,此時i為假,故第二行沒有被打印.
awk 'i=!i' test11 第 1 行 第 3 行 第 5 行 第 7 行 第 9 行 awk '!(i=!i)' test11 或 awk 'a=!(i=!i)' test11 第 2 行 第 4 行 第 6 行 第 8 行
12.awk數組統計狀態
# 先解釋split和數組時怎樣結合的: awk -v ts="dawa;erwa;sanwa" 'BEGIN{ split(ts,huluwa,";");for(i in huluwa){print i,huluwa[i]} }' 1 dawa 2 erwa 3 sanwa # split按照指定的分隔符切割字符串,將切割后的字段賦值到元組中,鍵是數字,值是對應字段. netstat -pnta 2>&1|grep 'ESTABLISHED'|head | awk '{ split($5,a,":");b=a[1];c=a[2];{print b,c} }' 127.0.0.1 6025 127.0.0.1 6026 127.0.0.1 6025 127.0.0.1 6023 127.0.0.1 6025 127.0.0.1 6023 127.0.0.1 6023 127.0.0.1 6026 127.0.0.1 9090 127.0.0.1 6025 # 統計ESTABLISHED(已建立的連接)的遠程ip: netstat -pnta 2>&1|grep 'ESTABLISHED'|awk '{split($5,a,":");b=a[1];count[b]++}END{for(i in count)print i,count[i]}
13.注意幾點書寫:
不同模式之間用{}隔開;
數字的運算、判斷放在()中;
數組的運算放在{}中;
print放在{}中.
參考博客:https://www.cnblogs.com/xudong-bupt/p/3721210.html
參考博客:https://www.cnblogs.com/jiqianqian/p/7944013.html
朱雙印的博客寫的很詳細,通俗易懂:http://www.zsythink.net/archives/2093