awk的命令格式
awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定義列分隔符
-f 指定調(diào)用腳本
-v 定義變量
' '引用代碼塊,awk執(zhí)行語句必須包含在內(nèi)
BEGIN{ } 初始化代碼塊燃观,在對(duì)每一行進(jìn)行處理之前,初始化代碼逢防,主要是引用全局變量犀农,設(shè)置FS分隔符
{ } 命令代碼塊,包含一條或多條命令
/ / 用來定義需要匹配的模式(字符串或者正則表達(dá)式)硫眯,對(duì)滿足匹配模式的行進(jìn)行上條代碼塊的操作
END{ } 結(jié)尾代碼塊蕴侧,在對(duì)每一行進(jìn)行處理之后再執(zhí)行的代碼塊,主要是進(jìn)行最終計(jì)算或輸出結(jié)尾摘要信息
$0 表示整個(gè)當(dāng)前行
$1 每行第一個(gè)字段
NF 字段數(shù)量變量
NR 每行的記錄號(hào)两入,多文件記錄遞增
FNR 與NR類似净宵,不過多文件記錄不遞增,每個(gè)文件都從1開始
\t 制表符
\n 換行符
FS BEGIN時(shí)定義分隔符
RS 輸入的記錄分隔符, 默認(rèn)為換行符(即文本是按一行一行輸入)
~ 匹配择葡,與==相比不是精確比較
!~ 不匹配紧武,不精確比較
== 等于,必須全部相等刁岸,精確比較
!= 不等于脏里,精確比較
&& 邏輯與
|| 邏輯或
+ 匹配時(shí)表示1個(gè)或1個(gè)以上
/[0-9][0-9]+/ 兩個(gè)或兩個(gè)以上數(shù)字
/[0-9][0-9]*/ 一個(gè)或一個(gè)以上數(shù)字
FILENAME 文件名
OFS 輸出字段分隔符, 默認(rèn)也是空格虹曙,可以改為制表符等
ORS 輸出的記錄分隔符迫横,默認(rèn)為換行符,即處理結(jié)果也是一行一行輸出到屏幕
-F'[:#/]' 定義三個(gè)分隔符
awk的內(nèi)建變量
image.png
創(chuàng)建一個(gè)實(shí)例文本
[root@Slave3 home]# cat netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
tcp 0 0 coolshell.cn:80 61.140.101.185:37538 FIN_WAIT2
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 116.234.127.77:11502 FIN_WAIT2
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
tcp 0 0 coolshell.cn:80 117.136.20.85:50025 FIN_WAIT2
tcp 0 0 :::22 :::* LISTEN
例子1
輸出netstat.txt的第1,4列
- 單引號(hào)中的被大括號(hào)括著的就是awk的語句,注意酝碳,其只能被單引號(hào)包含
- 其中的
n表示第幾例矾踱。注:$0表示整個(gè)行
[root@Slave3 home]# awk '{print $1,$4}' netstat.txt
Proto Local-Address
tcp 0.0.0.0:3306
tcp 0.0.0.0:80
tcp 127.0.0.1:9000
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp :::22
例子2:格式化輸出
[root@Slave3 home]# awk '{printf "%-8s %-8s\n",$1,$2}' netstat.txt
Proto Recv-Q
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
列子3:輸出行號(hào)
NR表示行號(hào)
[root@Slave3 home]# awk '{print NR,$0}' netstat.txt
1 Proto Recv-Q Send-Q Local-Address Foreign-Address State
2 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
3 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
4 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
5 tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
6 tcp 0 0 coolshell.cn:80 61.140.101.185:37538 FIN_WAIT2
7 tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
8 tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
9 tcp 0 0 coolshell.cn:80 116.234.127.77:11502 FIN_WAIT2
10 tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
11 tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
12 tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
13 tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1
14 tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
15 tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
16 tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK
17 tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
18 tcp 0 0 coolshell.cn:80 117.136.20.85:50025 FIN_WAIT2
19 tcp 0 0 :::22 :::* LISTEN
例子4:過濾條件輸出
找到第三列是0且第六列是LISTEN的行并輸出
其他比較運(yùn)算符:!=, >, <, >=, <=
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" {print $0}' netstat.txt
tcp 0 0 :::22 :::* LISTEN
例子5:過濾+格式化輸出
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
Local-Address Foreign-Address State
:::22 :::* LISTEN
例子6:指定分隔符輸出
[root@Slave3 home]# cat /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
-F: 表示使用:進(jìn)行分割
NR: 上面說表示行號(hào),我們這了過濾出前9條數(shù)據(jù)
[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子7:指定分隔符分割并指定分隔符輸出
如例子6我們采用:作為分割符分割疏哗,輸出時(shí)默認(rèn)是采用空格來輸出每個(gè)列的呛讲,我們可以執(zhí)行輸出時(shí)的分割符
[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' OFS="\t" /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子8:使用正則表達(dá)式過濾
$1 ~ /w+/ 表示第一列采用表達(dá)式w+來過濾。 ~表示模式開始 //之間插入正則表達(dá)式
[root@Slave3 home]# awk -F: '$1 ~ /w+/ {print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
BCS-myview-web:x:476:471:BCS-myview-web:/home/BCS-myview-web:/bin/bash
awk常用正則表達(dá)式
image.png
例子9:反模式過濾
對(duì)例子8的結(jié)果取反返奉,反模式采用的是!~
[root@Slave3 home]# awk -F: '$1 !~ /w+/ {print $0}' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
.....
例子10:拆分文件
按照第六列將第六列的值拆分成好幾個(gè)文件贝搁,例如第六列有aa,bb,cc,dd 則拆分后會(huì)分成 aa,bb,cc,dd這幾個(gè)文件,aa里面就包含第六列為aa的所有數(shù)據(jù)
[root@Slave3 xuzhiyong]# awk 'NR!=1{print > $6}' netstat.txt
[root@Slave3 xuzhiyong]# ls
ESTABLISHED? FIN_WAIT1? FIN_WAIT2? LAST_ACK? LISTEN LISTEN? netstat.txt TIME_WAIT?
[root@Slave3 xuzhiyong]# ll
total 32
-rw-r--r-- 1 root root 504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root 82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root 246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root 81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root 78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root 237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root 246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cd ESTABLISHED^M
: Not a directoryISHED
[root@Slave3 xuzhiyong]# cat ESTABLISHED?
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
例子11:拆分文件采用if語句自定義拆分
NR!=1 表示不輸出第一行芽偏,就是表頭
里面的條件邏輯表示將第六行為TIME|ESTABLISHED放到1.txt;LISTEN放到2.txt;其他的放到3.txt
[root@Slave3 xuzhiyong]# awk 'NR!=1 {if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt"}' netstat.txt
[root@Slave3 xuzhiyong]# ll
total 44
-rw-r--r-- 1 root root 750 Mar 22 17:46 1.txt
-rw-r--r-- 1 root root 315 Mar 22 17:46 2.txt
-rw-r--r-- 1 root root 409 Mar 22 17:46 3.txt
-rw-r--r-- 1 root root 504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root 82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root 246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root 81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root 78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root 237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root 246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cat 1.txt
tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
例子12: 統(tǒng)計(jì)字節(jié)數(shù)量
****awk命令是針對(duì)每一個(gè)行進(jìn)行的操作****
例如統(tǒng)計(jì)文件夾下這些文件的總共大小
[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h
-rw-r--r-- 1 root root 73 Mar 24 05:54 1.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 1.cpp
-rw-r--r-- 1 root root 0 Mar 24 05:51 1.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 2.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 2.cpp
-rw-r--r-- 1 root root 57 Mar 24 05:55 2.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 3.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 3.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 4.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 4.h
使用管道命令 | 對(duì) ls -l .cpp .c .h 輸出的結(jié)果做統(tǒng)計(jì)雷逆。其中記住awk命令是針對(duì)每一個(gè)行進(jìn)行的操作*,所以{sum+=$5}表示每一行的第五列的值都加起來,然后內(nèi)建變量END指定處理完每一行后的操作{print sum}
[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
130
例子13:統(tǒng)計(jì)2
[root@server-1 xuzhiyong]# awk 'BEGIN {count=0 ; print "=====start====="} {count++;} END {print "The file size is ",count}' /etc/passwd
=====start=====
The file size is 35
例子14:awk的內(nèi)嵌函數(shù)
image.png
image.png
[root@server-1 xuzhiyong]# awk '{print length($6)}' netstat.txt
6
7
7
7
10
10
12
12
10
12
10
12
10
12
10
9
12
10
6