awk的使用及printf 格式输出
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,1基础用法awk -F: '{print$1}' /etc/passwd #显示passwd 的用户名 awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/pa
千家信息网最后更新 2025年02月23日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#和上面一样,只不过上面是||的写法,这个是|的写法
输出
变量
字符
内容
写法
字段
格式
数组
处理
开头
用户
循环
分隔符
小数
引号
思路
磁盘
空格
空间
管道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云服务网络安全审查体系
游戏服务器性能测试
怀旧服能换哪些服务器
惠州旅游软件开发方案
网络安全策略有哪几种
服务器bios重置管理口
新疆网络安全的信息范文
网络安全法第21条处罚
大型实验室服务器供应商
苏州手机软件开发多少钱
天刀手游服务器问题
腾讯云里的服务器可以转让
榆次学校触摸签名软件开发公司
怎么修复u盘删掉的数据库
数据库的状态位应该用什么类型
成都泽安谦软件开发公司
oracle数据库虚拟id
山东服务器电源厂家排名
北京网络技术服务保障
现在软件开发那个号
业余时间自学软件开发
阿里云服务器购买后如何远程登陆
中国人寿财险总公司网络安全处
网络安全监督
包头软件开发操作
武汉门户云网络技术有限公司
南通市鑫阳软件开发有限公司
服务器只开80 ipsec
bvd数据库价格
武安一站式网络推广需要服务器吗