awk文本处理
基于模式匹配检查输入文本,逐行处理并输出
通常用在shell脚本中,获取指定的数据
单独用时,可对文本数据做统计
一、语法格式
格式1:命令 | awk [选项] '[条件]{编辑指令}'
格式2:awk [选项] '[条件]{编辑指令}' 文件..
若有多条语句,可用分号分隔
print是最常用的指令
# awk -F ";" '{print $1,$2}' /etc/passwd
root x
bin x
.. ..
二、常用命令选项
-F:指定分隔符,可省略(默认空格或Tab位)
cat m.txt
11111111 Caremi
222 IT Group
#awk'{print $1}' m.txt
11111111
222
#awk -F "r" '{print $1}' m.txt
11111111 Ta
222 IT G
#df -hT /boot | tail -1 //第一行
#df -hT /boot | tail -1 | awk '{print $6}' //第一行第六列
# head -5 /etc/passwd | awk -F:(分隔符可以紧挨-F) '{print $1,$7}'
三、awk内置变量
FS 保存或设置字段分隔符,例如FS=":"
$n 指定分隔的第n个字段,如$1、$3分别表示第1、3列
$0 当前读入的整行文本内容
NF 记录当前处理行的字段个数(列数)
NR 记录当前已读入行的数量(行数)
FNR 保存当前处理行在原文本内的序号(行号)
#awk '{print "第"FNR"行","有"NF"列"}' m.txt
#awk '{print "Last:"$NF}' m.txt //$NF表示每行最后一个字段
#awk -F: '$1==ENVIRON["USER"]{print $3}'
/etc/passwd //输出当前用户的UID信息
四、awk处理的时机
1.行前处理,BEGIN{}
读入第一行文本之前的执行
一般用来初始化操作
2.逐行处理,{}
逐行读入文本执行相应的处理
是最常见的编辑指令块
3.行后处理,END{}
处理完最后一行文本之后执行
一般用来输出处理结果
1-3可单独使用,也可以一起使用
#awk 'BEGIN {a=34;print a+12}' //预处理不需要数据文件
#awk 'BEGIN{x=0}/<bash$/{x++}
END{print x}' /etc/passwd //统计使用bash的用户个数
#awk 'BEGIN{print NR}END{print NR}' m.txt //预处理时,行数为0
//全部处理完以后,行数为已读入的行数
五、awk处理条件
1.条件的表现形式
(1)正则表达式
/正则表达式/
~ 匹配
!~ 不匹配
#awk -F:'/^ro/{print}' /etc/passwd //列出以ro开头的记录
#awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
//列出第7个字段不以bash结尾的用户名、登录shell
(2)数值/字符串比较
==;!=;>;>=;<;<=
cat reg.txt
abcd XX
XX
abcabcd XX
#awk 'NR==2{print}' reg.txt //XX
#awk '$2!="XX"{print}' reg.txt //XX,输出第2列不是XX的行
#awk 'NF>=2{print}' reg.txt //输出含2个及以上字段的行
abcd XX
abcabcd XX
(3)逻辑比较
&&:期望多个条件都成立;||:只要有一个条件成立即满足要求
#awk -F:'$3>=0&&3<2{print $1,$3}'
/etc/passwd //列出UID小于2的用户信息
root 0
bin 1
#awk -F: '$3==1||$3==7{print $1,$3}'
/etc/passwd //列出UID为1或7的用户信息
bin 1
halt 7
(4)运算符
+,-,*,/,%,++,--,+=,-=,*=,/=
#awk 'NR%2==1{print}' reg.txt //输出奇数行文本
abcd XX
abcabcd XX
#awk 'BEGIN{i=0}{i+=NF} END{print i}' reg.txt //统计文本的总字段个数
5
#seq 200 | awk 'BEGIN{i=0}{$0%3==0}&&
{$0%13==0}{i++} END{print i}' //计算能同时被3和13整除的整数个数