awk-条件和循环
模式PATTERN
PATTERN:根据pattern条件,过滤匹配的行,再做处理
如果未指定:空模式,匹配每一行
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
[root@localhost ~]# ss -nt | awk "/^ESTAB/" ESTAB 0 0 192.168.80.171:22 192.168.80.144:2708 ESTAB 0 0 192.168.80.171:22 192.168.80.181:32940 ESTAB 0 52 192.168.80.171:22 192.168.80.1:56076
[root@localhost ~]# ifconfig ens33 | awk '/netmask/{print $2}' 192.168.80.171
relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
root@ubuntu2004:~# awk '0' /etc/passwd root@ubuntu2004:~# awk '1' /etc/passwd root:x:0:0:root:/root:/bin/bas
root@ubuntu2004:~# awk '!0' /etc/issue Ubuntu 20.04.3 LTS \n \l
root@ubuntu2004:~# awk -v i=0 'i{print $0}' /etc/issue root@ubuntu2004:~# awk -v i=1 'i{print $0}' /etc/issue Ubuntu 20.04.3 LTS \n \l
root@ubuntu2004:~# seq 10 | awk 'n++{print $0}' root@ubuntu2004:~# seq 10 | awk 'n++' #第一个为0不打印 2 3 4 5 6 7 8 9 10
root@ubuntu2004:~# seq 10 | awk '!n++' 1
真 假 真 假 取反
root@ubuntu2004:~# seq 10 | awk '(i=!i)' 1 3 5 7 9
root@ubuntu2004:~# seq 10 | awk '!(i=!i)' 2 4 6 8 10
root@ubuntu2004:~# seq 10 | awk -v i=1 '(i=!i)' 2 4 6 8 10
root@ubuntu2004:~# seq 10 | awk 'NR<3 || NR>7' 1 2 8 9 10
root@ubuntu2004:~# seq 10 | awk 'NR>3 && NR<7' 4 5 6
root@ubuntu2004:~# seq 10 | sed -n '3,7p' 3 4 5 6 7
root@ubuntu2004:~# seq 10 | head -n7 |tail -n3 5 6 7
awk 编程
if
root@ubuntu2004:~# awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd nobody 65534 wang 1000
root@ubuntu2004:~# awk 'BEGIN{score=87;if(score>=80){print "good"}else if(score>=60){print "pass"}else{print "no pass"}}' good root@ubuntu2004:~# awk 'BEGIN{score=61;if(score>=80){print "good"}else if(score>=60){print "pass"}else{print "no pass"}}' pass root@ubuntu2004:~# awk 'BEGIN{score=59;if(score>=80){print "good"}else if(score>=60){print "pass"}else{print "no pass"}}' no pass
while
awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
for
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
[root@localhost ~]# time awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}' 5050 real 0m0.007s user 0m0.004s sys 0m0.002s
awk加不连续数字
[root@localhost ~]# cat abc.txt 1 2 4 3 5 [root@localhost ~]# tr ' ' + < abc.txt |bc 15
[root@localhost ~]# awk '{for(i=1;i<=NF;i++){sum+=i};print sum}' abc.txt 15
[root@localhost ~]# awk 'BEGIN{for(i=1;i<=100;i++){if(i==50)break;sum+=i};print sum}' 1225 [root@localhost ~]# awk 'BEGIN{for(i=1;i<=100;i++){if(i==50)contine;sum+=i};print sum}' 5050
[root@localhost ~]# awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd root 0 daemon 2 lp 4 shutdown 6