awk數組詳解、實戰


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
awk實現統計ip次數

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
awk統計名字出現次數

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
test11文件內容

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM