awk编程语言/数据处理引擎
创造者:Aho、Weinberger、Kernighan
基于模式匹配检查输入文本,逐行处理并输出
通常用在shell脚本中,获取指定的数据
单独用时,可对文本数据做统计
命令格式解析
主要用法
格式1:前置命令|awk [选项] '[条件]{指令}'
格式2:awk[选项]'[条件]{指令} '文件
awk '{print $1,$3}' test.txt
常用命令选项
-F:指定分隔符,可省略(默认空格或Tab位)
awk -F :'{print $1,$3}' /etc/passwd
查看登录失败的IP地址有哪些
awk '/Failed/{print $11}' /var/log/secure
查看内存的剩余容量
free | awk '/Mem/{print $4}'
过滤网络流量
ifconfig eth0 | awk '/RX p/{print $5}'
awk内置变量
FS 保存或设置字段分隔符,例如FS=":",与-F功能一样
$n 指定分隔的第n个字段,如$1、$3分别表示第1、第3列
$0 当前读入的整行文本内容
NF 记录当前处理行的字段个数(列数)
NR 记录当前已读入行的数量(行数)
awk -F :'{print NR,NF}' /etc/passwd
awk -F:'{print $NF}' /etc/passwd //输出每行的最后一个字段
awk -F:'{print "用户名:",$1,"解释器:",$7}' /etc/passwd
awk过滤的时机
在所有行前处理,BEGIN{}
读入第一行文本之前执行
一般用来初始化操作
逐行处理,{}
逐行读入文本执行相应的处理
是最常见的编辑指令块
在所有行后处理,END{}
处理完最后一行文本之后执行
一般用来输出处理结果
awk过滤时机
awk 'BEGIN{A=34;print a+12}' //预处理不需要数据文件
//统计使用bash的用户个数
awk 'BEGIN{x=0}/\<bash$/{x++} END{print x}' /etc/passwd
//预处理时,行数为0
//全部处理完以后,行数为已读入文本的行数
awk 'BEGIN{print NR} END{print NR}' m.txt
使用awk提取文本
条件设置示例
-/正则表达式
-~匹配、!~不匹配
//列出以ro开头的用户
awk -F: '/^ro{print}' /etc/passwd
//列出第7个字段不以bash结尾的用户名、登录Shell
awk -F:'$7!~/bash$/{print $1,$7}' /etc/passwd
条件设置示例
数值比较
==等于、!=不等于
awk 'NR==2{print}' reg.txt //输出第2列文本
awk '$2!="xx"{print}' reg.txt //输出第2列不是xx的行
awk 'NF >=2{print}' reg.txt //输出包含2个及以上字段的行
多个条件比较测试
&&逻辑与:期望多个条件都成立
|| 逻辑或:只要有一个条件成立即可满足要求
//列出UID少于2的用户信息
awk -F:'$3>=0&&$3<2{print $1,$3}' /etc/passwd
//列出UID为1或7的用户信息
awk -F: '$3==1||$3==7{print $1,$3}' /etc/passwd
变量的运算
//输出奇数行文本
awk 'NR%2==1{print}' reg.txt
//统计文本的总字段个数
awk 'BEGIN{I=0}{i+=NF} END{print i}' reg.txt
//计算能同时被3和13整除的整数个数
seq 200 | awk 'BEGIN{i=0} ($0%3==0)&&($0%13==0){i++}END{print i}'