目录
一、awk基础语法
1.1 主要用法
1.2 awk内置变量
1.3 过滤时机
二、awk基础应用案例
三、awk条件判断
3.1 正则表达式
3.2 数值、字符比较
3.3 逻辑比较测试
3.4 运算符
四、awk流程控制
4.1 if语句
4.2 for循环
五、awk数组与应用案例
六、awk综合案例
6.1 ss命令
6.2 过滤连接状态
注:/etc/passwd内容
创造者:Aho、Weinberger、Kernighan
基于模式匹配检查输入文本,逐行处理并输出
通常用在Shell脚本中,获取指定的数据
单独用时,可对文本数据做统计
格式1:前置命令 | awk [选项] '[条件]{指令}'
格式2:awk [选项] '[条件]{指令}' 文件.. ..
其中指令多条语句可以分号分割
其中$1,$3表示列数,相比grep只能对行过滤,-F可以指定分隔符,默认分隔符(空格或Tab)
xm@ubuntu:~/shell$ awk '{print $1,$3}' test.txt
hello world
welcome Beijing
xm@ubuntu:~/shell$ awk -F: '{print $1,$3}' /etc/passwd
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
具有特殊含义,可以直接使用
变 量 |
用 途 |
FS |
保存或设置字段分隔符,例如 FS= “:”,与-F功能一样 |
$n |
指定分隔的第n个字段,如$1、$3分别表示第1、第3列 |
$0 |
当前读入的整行文本内容 |
NF |
记录当前处理行的字段个数(列数) |
NR |
记录当前已读入行的数量(行数) |
打印行数和列数
打印最后一列
xm@ubuntu:~/shell$ awk -F: '{print $NF}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
在所有行前处理BEGIN{},读入第一行文本之前执行,一般用来初始化操作
逐行处理{},逐行读入文本执行相应的处理,是最常见的编辑指令块
在所有行后处理,END{},处理完最后一行文本之后执行,一般用来输出处理结果
xm@ubuntu:~/shell$ awk 'BEGIN {a=34;print a+12}'
46
xm@ubuntu:~/shell$ awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd
2
xm@ubuntu:~/shell$ awk -F: 'BEGIN{print NR} END{print NR}' /etc/passwd
0
43
过滤内存信息
过滤磁盘信息
过滤CPU信息
过滤网卡信息
输出部分行、限制输出行的数据内容、设置多条件
条件表达式:正则表达式、数值/字符比较、逻辑比较
加上双斜杆,其中~表示匹配,!~表示不匹配
一个是匹配以ro开头的,一个是第7列尾部不为bash的
== 等于、!= 不等于
> 大于、>= 大于或等于
< 小于、<= 小于或等于
一是打印行数为2的,二是打印第七列不为/bin/bash
&&逻辑与,期望多个条件都成立,||逻辑或,只要有一个条件成立就满足
xm@ubuntu:~/shell$ awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd
root 0
daemon 1
xm@ubuntu:~/shell$ awk -F: '$3==1||$3==7{print $1,$3}' /etc/passwd
daemon 1
lp 7
+、-、*、/、% ++、-- 、+=、-=、*=、/=
xm@ubuntu:~/shell$ awk 'NR%2==1{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
avahi-autoipd:x:106:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
cups-pk-helper:x:110:116:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
whoopsie:x:112:117::/nonexistent:/bin/false
saned:x:114:119::/var/lib/saned:/usr/sbin/nologin
avahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
hplip:x:118:7:HPLIP system user,,,:/var/run/hplip:/bin/false
gnome-initial-setup:x:120:65534::/run/gnome-initial-setup/:/bin/false
xm:x:1000:1000:ubuntu18-04,,,:/home/xm:/bin/bash
mosquitto:x:123:127::/var/lib/mosquitto:/usr/sbin/nologin
xm@ubuntu:~/shell$ seq 200 | awk 'BEGIN{i=0} ($0%3==0)&& \
> ($0%13==0){i++} END{print i}'
5
单分支if判断
xm@ubuntu:~/shell$ seq 200 | awk 'BEGIN{i=0} ($0%3==0)&& \
> ($0%13==0){i++} END{print i}'
5
xm@ubuntu:~/shell$ awk -F: '{if($3>=1000){i++}} END{print i}' /etc/passwd
2
xm@ubuntu:~/shell$ awk -F: '{if($1=="root"){print $1,$3}}' /etc/passwd
root 0
xm@ubuntu:~/shell$ uptime | awk '{ if($NF>0.01){print "CPUload:"$NF}}'
CPUload:0.03
双分支if判断
xm@ubuntu:~/shell$ awk -F: '{ if($3>=1000){i++} else{j++} } \
> END{print "普通用户:" i, "系统用户:" j }' /etc/passwd
普通用户:2 系统用户:41
xm@ubuntu:~/shell$ ls -l /etc | awk \
> '{
> if($1~/^-/) {x++} else {y++} \
> } \
> END {print "普通文件个数:"x,"目录个数:"y}'
普通文件个数:95 目录个数:137
多分支if判断
xm@ubuntu:~/shell$ ls -l /etc | awk \
> '{
> if($1~/^-/) {x++} else if ($1~/^d/) {y++} else{z++} \
> } \
> END {print "普通文件个数:"x,"目录个数:"y, "其他个数:"z}'
普通文件个数:95 目录个数:130 其他个数:7
xm@ubuntu:~/shell$ awk 'BEGIN{ for (i=1;i<=5;i++) {print i}}'
1
2
3
4
5
xm@ubuntu:~/shell$ awk 'BEGIN{ for (i=5;i>=1;i--) {print i}}'
5
4
3
2
1
定义数组,格式:数组名[下标]=元素值
调用数组,格式:数组名[下标]
遍历数组,格式:for(变量名 in 数组名){print 数组名[变量]}
xm@ubuntu:~/shell$ awk 'BEGIN {
name[0]="jim"; name[1]="tom" ;print name[1],name[0]
}'
tom jim
xm@ubuntu:~/shell$ awk 'BEGIN { age["tom"]=22; age["jim"]=18; \
> print age["tom"],age["jim"]}'
22 18
xm@ubuntu:~/shell$ awk 'BEGIN{ x[0]=0;x[1]=1;x[2]=2;x[3]=3; for(i in x){print x[i]}}'
0
1
2
3
案例,统计web访问日志
简化数据,统计每个IP访问的次数
who命令可以查看登陆信息
xm@ubuntu:~/shell$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:105:111::/run/uuidd:/usr/sbin/nologin
avahi-autoipd:x:106:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
rtkit:x:109:114:RealtimeKit,,,:/proc:/usr/sbin/nologin
cups-pk-helper:x:110:116:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
whoopsie:x:112:117::/nonexistent:/bin/false
kernoops:x:113:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
saned:x:114:119::/var/lib/saned:/usr/sbin/nologin
pulse:x:115:120:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
avahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
colord:x:117:123:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
hplip:x:118:7:HPLIP system user,,,:/var/run/hplip:/bin/false
geoclue:x:119:124::/var/lib/geoclue:/usr/sbin/nologin
gnome-initial-setup:x:120:65534::/run/gnome-initial-setup/:/bin/false
gdm:x:121:125:Gnome Display Manager:/var/lib/gdm3:/bin/false
xm:x:1000:1000:ubuntu18-04,,,:/home/xm:/bin/bash
sshd:x:122:65534::/run/sshd:/usr/sbin/nologin
mosquitto:x:123:127::/var/lib/mosquitto:/usr/sbin/nologin