2、命令格式解析
awk编程语言/数据处理引擎 - 创造者:Aho、Weiberger、Kernighan - 基于模式匹配检查输入文本,逐行处理并输出 - 通常用在shell脚本中,获取指定的数据 - 单独用时,可对文本数据做统计
主要用法: - 格式1:前置命令 | awk [选项] '[条件] {指令}' - 格式2:awk [选项] '[条件] {指令}' 文件.. ..(多条语句可以分号分隔)
-F:指定分隔符,可省略(默认空格或Tab位)
awk -F: '{print $1,$3}' /etc/passwd #打印以TAB为分隔符的第1,3列
awk -F: '$1~/root/{print $1,$NF}' /etc/passwd #打印第一列和最后一列
awk '/Failed/{print $11}' /var/log/secure #检查登录失败的IP地址有哪些
free -h | awk '/Mem/{print $4}' #检查内存的剩余容量
ifconfig ens33 | awk -F'(' '/RX p/{print $2}'|sed 's/)//' #过滤网络流量
ifconfig ens33 | sed -ne '/RX p/ s/.*(//;/^[0-9]/ s/)//p' #等同过滤网络流量操作
ifconfig ens33 | awk '/RX p/{gsub(/(|)/,"");print $6,$7}' #等同过滤网络流量操作
ifconfig eth0 | awk -F[()] 'NR==5{print $2}' #等同过滤网络流量操作
3、awk内置变量
4、awk过滤机制
内置变量 释义 FS 保存或设置字段分隔符,例如FS=":",与-F功能一样 $n 指定分隔的第n个字段,如$1、$3分半表示第1、第3列 $0 当前读入的整行文本内容 NF 记录当前处理行的字段个数(列数) NR 记录当前已读入行的数量(行数)
1.在所有行前处理,BEGIN{ } - 读入第一行文本之前执行,一般用于初始化操作 2.逐行处理,{ } - 逐行读入文本执行相应的处理,最常见的编辑指令块 3.在所有行后处理,END{ } - 处理完最后一行文本之后执行,一般用来处理结果
awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd #统计使用bash的用户个数
二、awk处理条件
1、处理条件概述
2、条件设置示例
格式:
- awk [选项] '[条件] {编辑指令}' 文件 .. .. 条件表现形式: - 正则表达式 - 数值/字符串比较 - 逻辑比较 - 运算符
1.正则表达式:
- /正则表达式/
- ~匹配、 !~不匹配
awk -F: '/^ro/{print}' /etc/passwd #匹配ro开头的行并打印
awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd #匹配第7个字段不以bash结尾的用户名,登录shell
df -hT | awk '//$/{print $4}' #打印根分区剩余容量
awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd #输出root或adm账户的用户名和UID信息
2.数值比较
== 等于、 != 不等于
> 大于、>=大于或等于
< 小于、<=小于或等于
awk 'NR==2{print}' file.txt #输出第二行文本
awk '$2!=456{print}' test.txt #输出第二列不包含456的行
awk 'NF>=4{print}' test.txt #输出包含4个及以上字段的行
3、多个条件的组合
逻辑比较测试:
- && 逻辑与:期望多个条件都成立
- || 逻辑或:只要有一个条件成立即满足要求
awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd #列出UID小于2的用户信息
awk -F: '$3==0||$3==7{print $1,$3}' /etc/passwd #列出UID为0或7的用户信息
seq 20 | awk '$1%7==0||$1~/7/' #列出20以内整数中7的倍数或是含7的数
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 #同上,区别是||和|
4、变量的运算
运算符:
- +、-、*、/、%
- ++、--、+=、-=、*=、/=
awk 'NR%2==1{print}' test.txt #输出奇数行文本
awk 'BEGIN{i=0}{i+=NF}END{print i}' test.txt #统计文本的总字段个数
seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print i}' #计算能同时被3和13整除的个数
awk -F: '{print $1,"的解释器:"$7}' /etc/passwd #print不止打印变量,还可打印常量
三、awk数组
1、数组的定义及使用
定义数组: - 格式: 数组名[下标]=元素值 调用数组:
- 格式:数组名[下标] 遍历数组: - 用法:for (变量 in 数组名) {print 数组名[变量]}
awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' #i是下标,a[i]是数组元素
0 0
1 11
2 22
awk 'BEGIN{a["hehe"]=11;print a["hehe"]}' #awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
awk 'BEGIN{name[0]="tom";name[1]="bob";print name[0],name[1]}' #为数组name赋值并打印
lastb | awk '$2~/ssh:notty/{ip[$3]++} END{for(i in ip){print ip[i],i}}'|sort -n #统计失败登录的IP,左侧打印次数
2、printf使用
参数 示意 说明(不加-就是右对齐) %d 十进制有符号整数 %4d表示输出一个小于4位的数值时, 将在前面补0使其总宽度为4位 %u 十进制无符号整数 %f 浮点数 %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐 %s 字符串 %6.9s 表示显示一个长度不小于6且不大于9的字符串
%-9s 表示输出10个字符左对齐
%c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x,%X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 n 换行 f 清屏并换页 r 回车 t Tab制表符 xhh 表示一个ASCII码用16进表示,其中hh是1到2个16进制数 %ld
%lf
长整型
double浮点数
awk -F: 'BEGIN{printf ("%-15-s%15-s%-30sn","User","Uid","Home")}$7~/bash$/{printf ("%-15s%-15s%-30sn",$1,$3,$6);i++}END{print "Total",i,"lines."}' /etc/passwd
#过滤结尾为bash的行,格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、
#UID、家目录信息,最后一行提示一共已处理文本的总行数
3、awk内置字符串函数
函数 释义 gsub(r、s) 在整个$0中用s替代r gsub(r、s、t) 在整个t中用s替代r index(s,t) 返回s中字符串t的第一位置 length(s) 返回s长度 match(s,r) 测试s是否包含匹配r的字符串 split(s,a,fs) 在fs上将s分成序列a sprint(fmt,exp) 返回经fmt格式化后的exp sub(r,s) 用$0中最左边最长的子串代替s substr(s,p) 返回字符串s中从p开始的后缀部分 substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分 gensub(x,y,z[,A]) 全局替换,匹配正则x, 用y替换,z为指定替换目标是第几次匹配,A为指定替换目标是哪个域如$1,$2,若无A指$0,返回值为target替换后内容(未替换还是返回 target原内容),与sub、gsub不同的是,target内容替换后不改变 gensub(/123/,"x",1,$1) 替换$1中 第一次匹配到的123为字符x,返回值为$1替换后的内容,且$1的内容并没有改变 gensub(/a(.*)b/,"\1",1) 返回值为匹配正则第1对()内的内容 gensub(/a(.*)b(.*)c/,"\2",1) 返回值为匹配正则第2对()内的内容



