awk高级用法
if
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
查看密码文件第三列大于1000的虚拟用户,并且输出序列号和主机名称
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
查看最后有binbash的一行.并输出主机名称
awk '{if(NF>5) print $0}' /etc/fstab
查看大于五行的挂载情况,并输出整行内容
awk -F: '{if($3>=1000){printf"common user:%s\n",$1}else{printf"root or sysuser:%s\n",$1}}'
/etc/passwd
查看小于1000的输出系统或者root+主机名称,大于1000的输出虚拟+主机名称
awk -F: '{if($3>=1000) printf "common user: %s \n",$1; else printf "root or Sysuser :%s \n",$1}' /etc/passwd
查看小于1000的输出系统或者root+主机名称,大于1000的输出虚拟+主机名称(不用括号)
df -h|awk -F% '/^\/dev\/sd/{print $1}' |awk '$NF>=10{print $1,$5}' df | awk -F"[[:space:]]+|%" '/^\/dev\/sd/{if($5>10)print $1,$5}' awk "BEGIN{ test=100;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}’
while
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)};i++}}' /etc/grub2.cfg
查找首个为空行后边为linux16最后为其他字符的行,并且输出行后数据和对应的字符长度
do while:do做循环,while执行到特定目标停止
awk 'BEGIN{total=0;i=1;do{total+=i;i++}while(i<=100 );print total}'
从1+到100
For循环
awk 'BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}'
1+100
awk '/^[[:space:]]*linux16/{for(i=0;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg
查找首个为空行后边为linux16最后为其他字符的行,并且输出行后数据和对应的字符长度
其他写法
time(for((toule=0,i=1;i<=100000;i++))do let toule+=i;done;echo $toule)
break和continue
break结束整体循环
截止数
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==50) break ; sum+=i}print sum}'
continue结束本次循环
取双数
awk 'BEGIN{sum==0;for(i=1;i<=100;i++){if(i%2==0) continue ; sum+=i}print sum}'
Next
结束本行的默认循环
取出第三列为偶数的数据并输出
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
数组
定义并打印输出
awk 'BEGIN{animal ["cat"] ="CAT";propel ["xiaoming"]="boy" ;print propel["xiaoming"]}'
数组
创建一个文件输入重复字符
去重复值或判断重读数量
awk '!line[$0]++' 123.txt awk '{!line[$0]++;print $0,line[$0]}' 123.txt
数组分析
存在和不存在输出,存在输出1,不存在输出0
awk ' BEGIN{array["i"]="x"; array["j"]="y" ; print "i" in array, "y" in array}'
数组遍历
awk -F: ' {user[$1]=$3}END{for(i in user){print "username: "i, "uid: "user[i]}}' /etc/passwd awk 'BEGIN { a["x"] = "wo" a["y"] = "ni" a["z"] = "ta" for(i in a){ print i,a[i] } }'
查看网络状态
ss -nta
查看进程统计
ss -nta >123.log cat 123.log |sed -nr '1!s/^([^0-9]+) .*/\1/p'|sort |uniq -c cat 123.log | awk 'NR!=1{abc[$1]++}END{for(i in abc){print i,abc[i]}}' ss -ant | awk 'NR!=1{abc[$1]++}END{for(i in abc){print i,abc[i]}}'
网络进程
netstat -tan | awk '/^tcp/{abc[$NF]++}END{for(i in abc){print i,abc[i]}}'
查看ip
awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /etc/hostname
排序前十
sort -k2 -nr|head -10
二维数组
awk 'BEGIN { a[1][1] = 11 a[1][2] = 12 a[1][3]= 13 a[2][1] = 21 a[2][2] = 22 a[2][3]= 23 for(i in a) for(j in a[i]){ print a[i][j] } }'