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

 

posted @ 2022-04-24 13:25  gg888666  阅读(72)  评论(0编辑  收藏  举报