awk的使用及printf格式输出
1基础用法
awk -F: '{print$1}' /etc/passwd
#显示passwd 的用户名
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
#显示出shell为 "/bin/bash" 的用户
awk 'BEGIN{print"开头"}{print$0}END{print"结束"}' /etc/passwd
#BENGIN可以理解为页头,END理解为页脚
df -h|awk -F% '/^\/dev/{print $1}'|awk '{if($5>=20)print $1,$5"%"}
#先匹配dev,应为dev开头的才是真正挂载的找出磁盘空间大于20%的,思路先用%切成两段,把第一段管道给后面,这是$5已经取出想要的值了,进行比较大于20就输出
awk '{FS=":";OFS="---"}{print NR,$1,$2,$3}' /etc/passwd
#以:为定界,---为输出定界符
2.AWK if的使用
awk -F":" '{if($1=="root")print$0}' /etc/passwd
#单if使用,第一个字段内容等于"root"就显示。
awk -F":" '($1=="root"){print$0}' /etc/passwd
#另一种写法,和上面一样,不用带if 用()就可以了
awk -F":" '{if($1=="root")next}{print$0}' /etc/passwd
#单if使用,第一个字段等于"root"就跳过,显示后面的,和上面正好显示相反的
#next 本次直接跳过,exit直接退出,但是有EOF还是要执行EOF的内容
awk -F: '{if(NR>=2&&NR<=10)print $1}' /etc/passwd
#and的用法,表示显示第2到10行数据
awk -F: '{if(NR==2||NR==10)print $1}' /etc/passwd
#or的用法,表示显示第2和第10行
awk -F: '{if(NR!=2)print $1}' /etc/passwd
#取反的用法,除了第二行,其他都显示
awk -F: '{if($3<=500){print$1,$3,"系统用户"}else{print$1,$3,"普通用户"}}' /etc/passwd
#双分支使用,以ID号为参数,大于500的输出为系统用户 ,其他输出为普通用户
实战
df -h|awk -F% '/^\/dev/{print $1}'|awk '{if($5>=20)print $1,$5"%"}'
#功能,找出磁盘空间已用大于%20的,思路先用%切成两段,把第一段管道给后面,这是$5已经取出想要的值了,进行比较大于20就输出
3.AWK 变量的使用及内置变量
awk -v x=$z -F" " NR==x'{print$0}' /etc/ansible/hosts
#awk 不能直接调用变量,需要用-v 声明下变量,变量z是shell里面的,x是awk内部的,把z变量赋值给x,x就能在后面调用了,调用无需其他符号直接使用
echo "$*"|awk -v y=$y -F" " '{print $y}'
#在{prinf } 内存引用变量 ,必须用'' 单引号,双引号不可以
AKW取反
echo "1 2 3 4" |awk -F" " '{$1="";print$0}'
#会显示 2 3 4
echo "1 2 3 4" |awk -F" " '{$NF="";print$0}'
#显示1 2 3
echo "10.1.1.1"|awk -F"." '{print NF}'
#查看有几个字段数
echo "10.1.1.1"|awk -F"." '{print $NF}'
#查看最后一个字段的内容
创新互联建站专业为企业提供民和网站建设、民和做网站、民和网站设计、民和网站制作等企业网站建设、网页设计与制作、民和企业网站模板建站服务,十余年民和做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
awk '{FS=":";OFS="***"}{print NR,$1,$2,$3}' /etc/passwd
#以:分隔符,以"***"为显示分隔符,显示行号及$1 $2 $3
4.BEGIN和END
awk -F":" 'BEGIN{print"用户""\t""ID"}{if($3<5)print$1"\t"$3}END{print"结束"}' /etc/passwd
#BENGIN和END可以理解为页眉页脚,美化输出的
BEGIN的几种循环写法
awk 'BEGIN{for(i=0;i<=5;i++){print i}}'
awk -v i=0 'BEGIN{ while(i<=5){print i;i++}}'
awk 'BEGIN{i=0;while(i<=5){print i;i++}}'
awk 'BEGIN{i=7;do{print"测试"i;i++}while(i<5)}'
几种循环的写法,最后一种do是无论条件满足否都会执行一次
一种高级用法
cat /etc/fstab |awk '/^UUID/||/^\/dev/{fs[$3]++}END{for(i in fs){print i,fs[i]}}'
黄色表示匹配出UUID或者 /dev开头的行,红色以$3的字段名为数组的索引每次对数组的值加1,数组的值无需初始化默认为0,蓝色以数组的索引作为循环列表,显示i i就是$3的里的内容,fs[i]是每次累加最后统计的和
5.printf格式化输出
awk -F: '{printf "%-20s %-3s %-1s\n",$1,$2,$3}' /etc/passwd
#$1对应"%-20s",$2对应"%-1s",$3对应"%-1s\n",
"% s" %和s是固定格式 -表示左对齐默认右对齐 20表示显示字符不足20个用空格补全到20个字符
其他例子
printf "%s %s %s %s %s\n" a b c d e f g h i j
表示每个%s 对应这一个值输出,像这个格式位有5个,有10个值,正好输出会输出成两排
printf "%-10s %-8s %-4.3f\n" 郭芙 女 47.9876
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
6.作用范围之正则表达式
awk -F":" '/\/bin\/bash/{print $1}' /etc/passwd
#表示只匹配到"bin/bash"的,才处理
awk -F":" '!/\/bin\/bash/{print $1 $7}' /etc/passwd
#加个!号取反,匹配到"bin/bash"的不处理,其他都处理
awk -F":" '/\/bin\/bash/||/\/bin\/csh/{print $1 $7}' /etc/passwd
#表示匹配到"/bin/bash","/bin/csh"才处理
awk -F":" '/\/bin\/bash|\/bin\/csh/{print $1 $7}' /etc/passwd
#和上面一样,只不过上面是||的写法,这个是|的写法
网站题目:awk的使用及printf格式输出
文章源于:http://ybzwz.com/article/jogose.html