条件判断概述
- 输出所有行还是输出部分行?
- 如何限制仅输出部分行的数据内容?
- 如何设置多个条件?
基本语法
- awk [选项] '条件'{指令} 文件.. ..
条件表达式
- 正则表达式
- 数值/字符比较
- 逻辑比较(& ,||)
正则
/正则表达式/
~匹配, !~不匹配
[root@zabbix-server ~]# awk -F: '/^ro/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#过滤出第7列不是bash结尾的行打印出来
[root@zabbix-server ~]# awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
数值,字串比较
- ==等于,!=不等于
- >大于,>=大于或等于
- <小于,<=小于或等于
[root@zabbix-server ~]# awk 'NR==2{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@zabbix-server ~]# awk -F: '$7!="/bin/bash"' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@zabbix-server ~]# awk -F: '$3>=1000{print $1}' /etc/passwd
nfsnobody
k8s
逻辑比较测试
- &&逻辑与:期望多个条件都成立
- ||逻辑或:只要有一个条件成立即满足要求
#并
[root@zabbix-server ~]# awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd
root 0
bin 1
#或
[root@zabbix-server ~]# awk -F: '$3==0||$3==7{print $1,$3}' /etc/passwd
root 0
halt 7
运算符
- +,-,*,/,%
- ++,--,+=,-=,*=,/=
#打印当前行号除于2取余数等于0
[root@zabbix-server ~]# awk 'NR%2==0{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
#200以内能被3和13整除的数据有5个
[root@zabbix-server ~]# seq 200 | awk 'BEGIN{i=0} $1%3==0&&$1%13==0{i++} END{print i}'
5