awk模式種類
awk的模式分為這幾種
- 正則表達式
- 基本正則
- 擴展正則
- 比較表達式
- 范圍表達式
- 特殊模式
- BEGIN
- END
awk比較運算符(語法)
關系運算符 | 解釋 | 示例 |
---|---|---|
< | 小于 | x<y |
<= | 小于等于 | x<=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
>= | 大于等于 | x>=y |
> | 大于 | x>y |
~ | 匹配正則 | x~/正則/ |
!~ | 與表達式不匹配 | x!~/正則/ |
正則表達式語法(awk模式)
- 正則表達式作用在于在行數據中匹配想要的字符串、然后執行對應的action動作
- 支持基本正則、擴展正則
awk '/正則表達式/{print $0}'
再來看一下awk的語法,模式
也可以理解為是條件
awk [option] 'pattern[action]' file ...
awk默認是按行處理文本,如果不指定任何模式(條件),awk默認一行行處理
如果指定了模式,只有符合模式的才會被處理
經典語法圖解
awk正則練習/etc/passwd
創建測試數據
創建用戶
[242-yuchao-class01 root ~]#for i in `seq 10`;do useradd t${i};done刪除用戶
for i in `seq 10`;do userdel -rf t${i};done
awk提取出/etc/passwd 中root用戶行
簡寫
[242-yuchao-class01 root ~]#awk -F ':' '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash或者寫全了動作
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash提取root用戶、以及它的登錄解釋器信息
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $1,$NF}' /etc/passwd
root /bin/bash
awk提取出允許登錄的用戶行
[242-yuchao-class01 root ~]#awk -F ':' '/bash$/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash
awk提取出用戶名以t開頭的行
方法1
[242-yuchao-class01 root ~]#awk -F ':' '/^t/' /etc/passwd
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash方法2
[242-yuchao-class01 root ~]#awk -F ':' '/^t.*/' /etc/passwd
提取出由用戶自己創建的用戶
(uid大于1000)
[242-yuchao-class01 root ~]#awk -F ':' '$3>=1000{print $0}' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash(家目錄在/home下的用戶)
[242-yuchao-class01 root ~]#awk '/\/home.*/' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash
提取出禁止登錄的用戶
對bash的解釋器行,結果取反對最后一個字段進行正則匹配
awk -F ':' '$NF!~/bash$/{print $0}' /etc/passwd對所有字段正則匹配
awk -F ':' '$0!~/bash$/{print $0}' /etc/passwd指定找出nologin的行
[242-yuchao-class01 root ~]#awk -F ':' '/nologin/{print $0}' /etc/passwd
awk正則提取ip
1.指定行號,提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk 'NR==2{print $2}'
192.168.0.2422.指定分隔符提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk -F 'inet|netmask' 'NR==2{print $2}'192.168.0.242
?
?
判斷常用服務端口是否存活
提取出http和ssh服務的端口方法1,指定對第四列字段進行正則匹配,是否存在22或80端口
[242-yuchao-class01 root ~]#netstat -tunlp|awk '$4~/22|80/{print $0}'
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7040/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 900/sshd
tcp6 0 0 :::80 :::* LISTEN 7040/nginx: master
tcp6 0 0 :::22 :::* LISTEN 900/sshd方法2,整行匹配,偷懶寫法
[242-yuchao-class01 root ~]#netstat -tunlp|awk '/22|80/'
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7040/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 900/sshd
tcp6 0 0 :::80 :::* LISTEN 7040/nginx: master
tcp6 0 0 :::22 :::* LISTEN 900/sshd
提取/etc/passwd的10~20行
要求且顯示行號
[242-yuchao-class01 root ~]#awk 'NR>=10&&NR<=20{print NR,$0}' /etc/passwd
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
18 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
awk范圍模式
- 可以用到正則
- 可以用到比較運算符
范圍模式就是從某一行到某一行,均是符合條件的行。
語法
awk '/regex1/,/regex2/{action}' yuchao.log
顯示root行到mail用戶的行
處理/etc/passwd
且顯示行號
[242-yuchao-class01 root ~]#awk '/^root/,/^mail/{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
顯示bin用戶到第五行
且顯示行號
[242-yuchao-class01 root ~]#awk '/^bin/,NR==5{print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
awk特殊模式BEGIN和END
BEGIN模式
- BEGIN模式作用是在awk開始讀取文件行數據、之前就先執行,一般用于預定義一些操作,比如數據的表頭格式化等。
- BEGIN后面必須跟上action動作
BEGIN打印
顯示/etc/passwd前五行,且打印BEGIN動作
[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老師正在帶你學習awk"}NR<=5{print $0}' /etc/passwd
于超老師正在帶你學習awk
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
awk格式化打印/etc/passwd
提取root、mail、nobody三個用戶信息
- 名字
- 家目錄
- 登錄解釋器
且設置好表頭(格式化打印)
?
[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "用戶名","家目錄","解釋器"}$1~/(root|mail|nobody|t5)/{print $1,$6,$NF}' /etc/passwd |column -t
用戶名 家目錄 解釋器
root /root /bin/bash
mail /var/spool/mail /sbin/nologin
nobody / /sbin/nologin
t5 /home/t5 /bin/bash
BEGIN簡單玩法
只打印
處理數據之前的動作
[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老師帶你學linux"}'
于超老師帶你學linux
計算器
[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3}'
3.33333[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3+2*3}'
9.33333
awk自定義變量
數值變量
[242-yuchao-class01 root ~]#awk 'BEGIN{x=3;y=8;print x*y}'
24
字符串變量
[242-yuchao-class01 root ~]#awk 'BEGIN{name="于超";print name,"正在教你學linux"}'
于超 正在教你學linux
END模式
- 和BEGIN相反,END就是awk結束后的操作
-
END是awk讀取完所有的文件后,再執行END模塊,一般用來總結、格式化打印一個結果
-
END僅會在awk所有行數據處理完畢后,執行END動作。
簡單打印
[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "超哥帶你學linux"}NR<=5{print NR,$0}END{print "學完了,講的不錯"}' /etc/passwd
超哥帶你學linux
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
學完了,講的不錯
計算/etc/passwd行數
顯示/etc/passwd的用戶名、登錄解釋器、且在結尾顯示行數。
[242-yuchao-class01 root ~]#awk -F ':' '{print $1,$NF}END{print "總行數:",NR}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
tss /sbin/nologin
sshd /sbin/nologin
postfix /sbin/nologin
nginx /sbin/nologin
www /sbin/nologin
t1 /bin/bash
t2 /bin/bash
t3 /bin/bash
t4 /bin/bash
t5 /bin/bash
t6 /bin/bash
t7 /bin/bash
t8 /bin/bash
t9 /bin/bash
t10 /bin/bash
總行數: 31
統計如下數據,有多少空行
測試數據
[242-yuchao-class01 root ~]#cat t1.log -n1 I am teacher yuchao.2 I teach linux,python!34 I like english56 My website is http://yuchaoit.cn7 Our school site is https://apecome.com8 My qq num is 877348180910111213 #my qq num is not 8777777333334444488881118888000014 #15 #Goog good study , day day up!
統計空行數,用到了awk的變量功能
awk變量計數器
變量用法
num+=1
意思是 num=1 ; num=num+1
定義num變量,當做計數器,awk每處理一行,計數器就加一
實踐
[242-yuchao-class01 root ~]#awk '{num+=1;print "num的值是",num}' t1.log
num的值是 1
num的值是 2
num的值是 3
num的值是 4
num的值是 5
num的值是 6
num的值是 7
num的值是 8
num的值是 9
num的值是 10
num的值是 11
num的值是 12
num的值是 13
num的值是 14
num的值是 15
統計空行數(END總結)
[242-yuchao-class01 root ~]#awk '/^$/{num+=1;print $0}END{print "文件空行數是:",num}' t1.log文件空行數是: 6
可以省去打印的動作、直接統計
[242-yuchao-class01 root ~]#awk '/^$/{num+=1}END{print "文件空行數是:",num}' t1.log
文件空行數是: 6
END計算器
面試題,用awk計算 1+2+3+...+50
答案
[242-yuchao-class01 root ~]#seq 1 50 | awk '{i+=$0}END{print "1到50疊加總和是:",i}'
1到50疊加總和是: 1275
圖解、查看awk計算的過程
?
模式總結
- awk核心就是模式、動作、找到數據之后要干什么
- 模式就是awk的查找條件
- 正則表達式模式、
- 條件表達式,比較大小、是否相等
- 范圍表達式,從哪一行,找到哪一行
- 以及awk的特殊模式,設定開始前、結束后的條件+動作
- BEGIN
- END