本文共 3207 字,大约阅读时间需要 10 分钟。
awk 报告生成器
awk 名称来自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
awk 是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息注意:1. awk 处理过程: 依次对每一行进行处理,然后输出2. awk 更适合格式化文本,对文本进行较复杂的格式处理3. 语法:awk [options] 'Pattern{Action}' file,file1... awk [选项]‘模式{动作}’ file file1awk 内置变量
变量 | 说明 |
---|---|
FS | 指定输入字段分隔符,默认为空白字符 |
OFS | 指定输出字段分隔符,默认为空白字符 |
RS | 指定换行符(输入换行符),指定输入时的换行符,默认为回车键 |
ORS | 指定换行符(输出换行符),指定输出时的换行符,默认为回车键 |
NF | 分割的字段数量 |
NR | 行号 |
FNR | 分别计数每个文件的行号 |
FILENAME | 当前文件名 |
ARGV | 数组 |
ARGC | 数组的长度,即命令行参数的个数 |
1. 内置变量 NR、NF、FNR 举例
NR:行号,NF:分割的字段数量FNR:分别计数每个文件的行号
2. 内置变量 RS、ORS 举例
RS:指定换行符(输入换行符),指定输入时的换行符,默认为回车键ORS:指定换行符(输出换行符) 3. 内置变量 FILENAME 举例FILENAME:当前文件名4. 内置变量 ARGC、ARGV举例ARGV:数组ARGC:数组的长度,即命令行参数的个数 5. 自定义参数awk 内置函数
一:算数函数
常用算数函数 | 说明 |
---|---|
rand | 产生 6 位数的随机数 |
srand | 产生变化的 6 位随机数 |
int | 可用于截取整数部分 |
二:字符串函数
常用字符串函数 | 说明 |
---|---|
gsub | 改变所有符合匹配条件的字符 |
sub | 改变符合匹配条件的第一个字符 |
length | 获取字符串 |
index | 获取字符所在位置 |
split | 分割字符串 |
asort | 排序 |
asorti | 函数通过下标进行排序 |
有下面例子可以看出,gsub 可以改变所有匹配到字符,而 sub 只改变匹配到的第一个字符,所以 gsub 可以理解为全局变量,sub可以理解为局部变量
length 输出字段的长度,默认返回值为输出整行的长度split 可以将字符串按照指定字符串切割,结合 for 循环,赋值到数组,从而形成动态数组asort 根据元素的值进行排序asort 排序时会重新生成下标asorti 函数通过下标进行排序awk 基础
注意:
1. 内置变量内置函数 | 说明 |
---|---|
$0 | 整行 |
$NF | 分割后的最后一列 |
NF | 分割后的段数 |
$(NF-1) | 倒数第二列 |
2. 内置函数的外侧不能加双引号,否则会当做文本输出打印出来
语法:awk [options] 'Pattern{Action}' file
action 指的是动作,最常用的动作为:print、printf,用于格式化后输出文本好的,知道了简单的语法后我们就开始举例了一:print 打印文本内容直接使用 print 动作,相当于 cat 命令获取相关列,awk 默认空格为分隔符,$1 与 $5 之间的 “,” 表示空格,即表示第 1,5 列当最后一列数值为空时,取值时也会为空。由下例可知 $(NF-1) 表示每行的倒数第二位,因为 awk 是以 行 为单位处理脚本的添加组合,内置函数的外侧不能加双引号,否则会当做文本输出打印出来验证 split 数组的下标注意:split 函数分割后的数组元素下标是从 1 开始的二:awk 分隔符注意:FS,OFS 为内置变量,-F、-v 为 awk 的参数1. 输出分隔符指定输出分隔符:-F、-v FS="#"2. 输入分隔符指定输入分隔符:-v OFS="---",看到例子应该明白了吧,OFS 默认是以空格为分割的,此处可以结合 -v FS 来修改指定分隔符三:awk 格式化
使用 printf 来完善 awk 的格式化能力注意:1. 使用 printf 动作输出的文本不会换行,如果需要换行,可以在对应的 “ 格式替换符 ” 后加入 “ \n ” 进行转义2. 使用 printf 动作时,“ 指定的格式 ” 与 “ 被格式化的文本 ” 之间,需要用 “ 逗号 ” 隔开3. 使用 printf 动作时,“ 格式 ” 中的 “ 格式替换符 ” 必须与 “ 被格式化的文本 ” 相互对应awk 模式
一:空模式
如下图中框框位置为空,即为空模式二:关系运算模式关系运算符举例关系运算符 ' ~ ' 结合正则举例,其中 $2 表示第二列,$2~/正则/ 表示文中第二列如果与正则匹配就执行相应的动作三:BEGIN,END 模式
表头、表内容、表尾四:正则模式注意:awk 中正则需要 / / 内匹配以 sys 开头的用户匹配以 /bin/bash 结尾的用户使用扩展正则表达式(亲测 centOS7.4,Ubuntu16.04 中在使用 {x,y} 时不需要 --posix 或 --re-interval 配合)不过尽量使用来配合扩展正则表达式吧五:行范围模式通过字符匹配范围行,即匹配第一次出现的字符 x 到第一次出现的字符 y 之间的行通过行号匹配范围行awk 语法结构
一:if(条件){语句;语句1 ...} else if(条件){语句;语句1 ...} else{语句;语句1 ...}
二:语法一:for(初始化; 布尔表达式; 更新){语句}语法二:for(变量 in 数组) {代码语句}三:while( 布尔表达式 ) {语句}四:do {代码语句}while(条件)注意:do...while... 循环语句,即使不符合条件也会先执行一次五:continue 跳出 “当前” 循环,break 跳出 “整个” 循环六:exit 与 nextexit 跳出 “整个 awk 命令” next 跳过当前行三元运算
注意:可以替代 if 语句中的 if(条件){语句;语句1 ...} else{语句;语句1 ...} 语法
1. 如图中例子,若条件为真,则用 系统用户:A 普通用户:B 来表示2. 统计 /etc/passwd 用户个数3. 打印奇偶行注意:1. awk 中,如果省略了模式对应的动作,当符合条件时,默认动作为打印整行,即{print $0}2. awk 中,0 或空字符表示 “假”,非 0 或非空字符表示 “真”如下: awk '{print $0}' one.txt 中,动作 {print $0} 前没有任何模式,并不表示空字符,而是表示 空模式,输出的没行都满足条件,匹配后的结果为真,即输出文本中的每行明白了上面的内容,我们来打印 奇偶行 就容易理解了最后我们再来看一下 i 的值是多少awk数组注意:awk 中数组的下标可以是数字也可以是字符串(需要加双引号)awk 中数组的下标默认是从 1 开始的awk 中数组的本质是关联数组1. 简单的数组可以通过下标数字来取值,如:第一个例子第二个例子说明空字符串是合法的在直接引用不存在的元素时,awk 会自动创建一个空字符串,如:第三个例子2. 判断数组是否存在3. 使用 delete 删除数组4. 数组结合 for 循环实现遍历输出5. 实战统计同一个 ip 出现的次数统计每个名字出现的次数转载于:https://blog.51cto.com/12384628/2287482