目錄
一、Awk 實戰(zhàn)講解
1.1 awk 的原理
1.2 BEGIN 和 END 模塊
1.3 運算符
1.4 常用 awk 內(nèi)置變量
1.5 awk 正則
1.6 awk 常用字符串函數(shù)
一、Awk 實戰(zhàn)講解
????????awk 是一種很棒的語言,它適合文本處理和報表生成,其語法較為常見,借鑒了某些語言的一些精華,如 C 語言等。在 linux 系統(tǒng)日常處理工作中,發(fā)揮很重要的作用,掌握了 awk 將會使你的工作變的高大上。 awk 是三劍客的老大,利劍出鞘,必會不同凡響。
1.1 awk 的原理
通過一個簡短的命令,我們來了解其工作原理:
$ awk '{print $0}' /etc/passwd
$ echo hhh | awk '{print "hello,world"}'
$ awk '{ print "hiya" }' /etc/passwd
????????你將會見到 /etc/passwd 文件的內(nèi)容出現(xiàn)在眼前?,F(xiàn)在,解釋 awk 做了些什么。調(diào)用 awk時,我們指定 /etc/passwd 作為輸入文件。執(zhí)行 awk 時,它依次對 /etc/passwd 中的每一行執(zhí)行 print 命令。所有輸出都發(fā)送到 stdout,所得到的結(jié)果與執(zhí)行 cat /etc/passwd 完全相同。
????????現(xiàn)在,解釋 { print } 代碼塊。在 awk 中,花括號用于將幾塊代碼組合到一起,這一點類似于 C 語言。在代碼塊中只有一條 print 命令。在 awk 中,如果只出現(xiàn) print 命令,那么將打印當前行的全部內(nèi)容。
再次說明,awk 對輸入文件中的每一行都執(zhí)行這個腳本。
$ awk -F":" '{ print $1 }' /etc/passwd
$ awk -F":" '{ print $1 $3 }' /etc/passwd
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd
$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd
1.2 BEGIN 和 END 模塊
????????通常,對于每個輸入行,awk 都會執(zhí)行每個腳本代碼塊一次。然而,在許多編程情況中,
可能需要在 awk 開始處理輸入文件中的文本之前執(zhí)行初始化代碼。對于這種情況,awk 允許
您定義一個 BEGIN 塊。我們在前一個示例中使用了 BEGIN 塊。因為 awk 在開始處理輸入文
件之前會執(zhí)行 BEGIN 塊,因此它是初始化 FS(字段分隔符)變量、打印頁眉或初始化其它
在程序中以后會引用的全局變量的極佳位置。
????????awk 還提供了另一個特殊塊,叫作 END 塊。awk 在處理了輸入文件中的所有行之后執(zhí)行
這個塊。通常,END 塊用于執(zhí)行最終計算或打印應(yīng)該出現(xiàn)在輸出流結(jié)尾的摘要信息。
1.3 運算符
- awk 賦值運算符
a+5;等價于: a=a+5; 其他同類
[root@master1-admin ~]# awk 'BEGIN{a=5;a+=5;print a}'
10
- awk 邏輯運算符
[root@master1-admin ~]# awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'
0 1
- awk 正則運算符?
[root@master1-admin ~]# awk 'BEGIN{a="100testaaa";if(a~/100/){print "ok"}}'
ok
[root@master1-admin ~]# echo | awk 'BEGIN{a="100testaaa"}a~/100/{print "ok"}'
ok
- 關(guān)系運算符
????????如:> < 可以作為字符串比較,也可以用作數(shù)值比較,關(guān)鍵看操作數(shù)如果是字符串就會轉(zhuǎn)換為字符串比較。兩個都為數(shù)字才轉(zhuǎn)為數(shù)值比較。字符串比較:按照 ascii 碼順序比較。?
[root@master1-admin ~]# awk 'BEGIN{a="11";if(a>=9){print "ok"}}'
[root@master1-admin ~]# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
ok
[root@master1-admin ~]# awk 'BEGIN{a;if(a>=b){print "ok"}}'
ok
- awk 算術(shù)運算符
說明,所有用作算術(shù)運算符進行操作,操作數(shù)自動轉(zhuǎn)為數(shù)值,所有非數(shù)值都變?yōu)?0。
[root@master1-admin ~]# awk 'BEGIN{a="b";print a++,++a}'
0 2
[root@master1-admin ~]# awk 'BEGIN{a="20b4";print a++,++a}'
20 22
1.4 常用 awk 內(nèi)置變量
- 字段分隔符 FS
FS="\t" 一個或多個 Tab 分隔
[root@master1-admin ~]# vim tab.txt
ww CC IDD
[root@master1-admin ~]# awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt
ww CC IDD
FS="[[:space:]+]" 一個或多個空白空格,默認的
[root@master1-admin ~]# vim space.txt
we are studing awk now!
[root@master1-admin ~]# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' space.txt
we are
[root@master1-admin ~]# awk -F [[:space:]+] '{print $1,$2}' space.txt
we are
FS="[" ":]+" 以一個或多個空格或:分隔
[root@master1-admin ~]# vim hello.txt
root:x:0:0:root: /root:/bin/bash
[root@master1-admin ~]# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt
root x 0
-
字段數(shù)量 NF
[root@master1-admin ~]# vim hello.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin:888
[root@master1-admin ~]# awk -F ":" 'NF==8{print $0}' hello.txt
bin:x:1:1:bin:/bin:/sbin/nologin:888
- 記錄數(shù)量 NR
[root@master1-admin ~]# ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.78.135 netmask 255.255.255.0 broadcast 192.168.78.255
inet6 fe80::20c:29ff:fe2e:bef7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2e:be:f7 txqueuelen 1000 (Ethernet)
RX packets 3553 bytes 295498 (288.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13802 bytes 1002340 (978.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@master1-admin ~]# ifconfig ens32 | awk -F [" ":]+ 'NR==2{print $3}'
192.168.78.135
- RS 記錄分隔符變量
????????將 FS 設(shè)置成 "\n" 告訴 awk 每個字段都占據(jù)一行。通過將 RS 設(shè)置成 "",還會告訴 awk
每個地址記錄都由空白行分隔。?
[root@master1-admin ~]# vim recode.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345
Big Tony
200 Incognito Ave.
Suburbia, WA 67890
[root@master1-admin ~]# vim awk.txt
#!/bin/awk
BEGIN {
FS="\n"
RS=""
}
{
print $1 ", " $2 ", " $3
}
[root@master1-admin ~]# awk -f awk.txt recode.txt
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345
Big Tony, 200 Incognito Ave., Suburbia, WA 67890
-
OFS 輸出字段分隔符
[root@master1-admin ~]# awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt
root,x,0
bin,x,1
[root@master1-admin ~]# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt
root#x#0
bin#x#1
-
?ORS 輸出記錄分隔符
[root@master1-admin ~]# vim awk.txt
#!/bin/awk
BEGIN {
FS="\n"
RS=""
ORS="\n\n"
}
{
print $1 ", " $2 ", " $3
}
[root@master1-admin ~]# awk -f awk.txt recode.txt
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345
Big Tony, 200 Incognito Ave., Suburbia, WA 67890
1.5 awk 正則
- 規(guī)則表達式
????????awk '/REG/{action} ' file,/REG/ 為正則表達式,可以將 $0 中,滿足條件的記錄送入到:
action 進行處理?
[root@master1-admin ~]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@master1-admin ~]# awk -F : '$5~/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 取出 ip
[root@master1-admin ~]# ifconfig ens32 | awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $3}'
192.168.78.135
- 布爾表達式
awk '布爾表達式{action}' file 僅當對前面的布爾表達式求值為真時,awk 才執(zhí)行代碼塊。
[root@master1-admin ~]# awk -F: '$1=="root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@master1-admin ~]# awk -F: '($1=="root")&&($5=="root"){print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1.6 awk 常用字符串函數(shù)
- 替換
????????在 info 中查找滿足正則表達式,/[0-9]+/ 用 ”!” 替換,并且替換后的值,賦值給 info 未給 info 值,默認是 $0?
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!
- 查找
# 未找到,返回 0
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok
-
匹配查找?文章來源:http://www.zghlxwxcb.cn/news/detail-776536.html
如果查找到數(shù)字則匹配成功返回 ok,否則失敗,返回未找到?文章來源地址http://www.zghlxwxcb.cn/news/detail-776536.html
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok
- 截取
# 從第 4 個 字符開始,截取 10 個長度字符串
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes
- 分割
# 分割 info,動態(tài)創(chuàng)建數(shù)組 tA,awk for ...in 循環(huán),是一個無序的循環(huán)。并不是從數(shù)組下標 1...n 開始
[root@master1-admin ~]# awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a
到了這里,關(guān)于Linux 三劍客命令之 awk 詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!