Linux常用命令——awk

awk 报告生成器

awk 名称来自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
awk 是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
注意:
1. awk 处理过程: 依次对每一行进行处理,然后输出
2. awk 更适合格式化文本,对文本进行较复杂的格式处理
3. 语法:awk [options] 'Pattern{Action}' file,file1... awk [选项]‘模式{动作}’ file file1

awk 内置变量
变量说明
FS指定输入字段分隔符,默认为空白字符
OFS指定输出字段分隔符,默认为空白字符
RS指定换行符(输入换行符),指定输入时的换行符,默认为回车键
ORS指定换行符(输出换行符),指定输出时的换行符,默认为回车键
NF分割的字段数量
NR行号
FNR分别计数每个文件的行号
FILENAME当前文件名
ARGV数组
ARGC数组的长度,即命令行参数的个数

1. 内置变量 NR、NF、FNR 举例
NR:行号,NF:分割的字段数量

Linux常用命令——awk

FNR:分别计数每个文件的行号

Linux常用命令——awk

2. 内置变量 RS、ORS 举例
RS:指定换行符(输入换行符),指定输入时的换行符,默认为回车键
ORS:指定换行符(输出换行符)

Linux常用命令——awk
3. 内置变量 FILENAME 举例
FILENAME:当前文件名
Linux常用命令——awk
4. 内置变量 ARGC、ARGV举例
ARGV:数组
ARGC:数组的长度,即命令行参数的个数
Linux常用命令——awk
5. 自定义参数
Linux常用命令——awk

awk 内置函数

一:算数函数

常用算数函数说明
rand产生 6 位数的随机数
srand产生变化的 6 位随机数
int可用于截取整数部分

Linux常用命令——awk

二:字符串函数

常用字符串函数说明
gsub改变所有符合匹配条件的字符
sub改变符合匹配条件的第一个字符
length获取字符串
index获取字符所在位置
split分割字符串
asort排序
asorti函数通过下标进行排序

有下面例子可以看出,gsub 可以改变所有匹配到字符,而 sub 只改变匹配到的第一个字符,所以 gsub 可以理解为全局变量,sub可以理解为局部变量
Linux常用命令——awk
length 输出字段的长度,默认返回值为输出整行的长度
Linux常用命令——awk
split 可以将字符串按照指定字符串切割,结合 for 循环,赋值到数组,从而形成动态数组
Linux常用命令——awk
asort 根据元素的值进行排序
Linux常用命令——awk
asort 排序时会重新生成下标
Linux常用命令——awk
asorti 函数通过下标进行排序
Linux常用命令——awk

awk 基础

注意:
1. 内置变量

内置函数说明
$0整行
$NF分割后的最后一列
NF分割后的段数
$(NF-1)倒数第二列

2. 内置函数的外侧不能加双引号,否则会当做文本输出打印出来

语法:awk [options] 'Pattern{Action}' file
action 指的是动作,最常用的动作为:print、printf,用于格式化后输出文本
好的,知道了简单的语法后我们就开始举例了
一:print 打印文本内容
直接使用 print 动作,相当于 cat 命令
Linux常用命令——awk
获取相关列,awk 默认空格为分隔符,$1 与 $5 之间的 “,” 表示空格,即表示第 1,5 列
Linux常用命令——awk
当最后一列数值为空时,取值时也会为空。由下例可知 $(NF-1) 表示每行的倒数第二位,因为 awk 是以 为单位处理脚本的
Linux常用命令——awk
添加组合,内置函数的外侧不能加双引号,否则会当做文本输出打印出来
Linux常用命令——awk
验证 split 数组的下标
注意:split 函数分割后的数组元素下标是从 1 开始的
Linux常用命令——awk
二:awk 分隔符
注意:FS,OFS 为内置变量,-F、-v 为 awk 的参数
1. 输出分隔符
指定输出分隔符:-F、-v FS="#"
Linux常用命令——awk
2. 输入分隔符
指定输入分隔符:-v OFS="---",看到例子应该明白了吧,OFS 默认是以空格为分割的,此处可以结合 -v FS 来修改指定分隔符
Linux常用命令——awk

三:awk 格式化
使用 printf 来完善 awk 的格式化能力
注意:
1. 使用 printf 动作输出的文本不会换行,如果需要换行,可以在对应的 “ 格式替换符 ” 后加入 “ \n ” 进行转义
2. 使用 printf 动作时,“ 指定的格式 ” 与 “ 被格式化的文本 ” 之间,需要用 “ 逗号 ” 隔开
3. 使用 printf 动作时,“ 格式 ” 中的 “ 格式替换符 ” 必须与 “ 被格式化的文本 ” 相互对应
Linux常用命令——awk
Linux常用命令——awk

awk 模式

一:空模式
如下图中框框位置为空,即为空模式
Linux常用命令——awk
二:关系运算模式
关系运算符举例
Linux常用命令——awk
关系运算符 ' ~ ' 结合正则举例,其中 $2 表示第二列,$2~/正则/ 表示文中第二列如果与正则匹配就执行相应的动作
Linux常用命令——awk

三:BEGIN,END 模式
表头、表内容、表尾
Linux常用命令——awk
四:正则模式
注意:awk 中正则需要 / / 内
匹配以 sys 开头的用户
Linux常用命令——awk
匹配以 /bin/bash 结尾的用户
Linux常用命令——awk
使用扩展正则表达式(亲测 centOS7.4,Ubuntu16.04 中在使用 {x,y} 时不需要 --posix 或 --re-interval 配合)不过尽量使用来配合扩展正则表达式吧
Linux常用命令——awk
五:行范围模式
通过字符匹配范围行,即匹配第一次出现的字符 x 到第一次出现的字符 y 之间的行
Linux常用命令——awk
通过行号匹配范围行
Linux常用命令——awk

awk 语法结构

一:if(条件){语句;语句1 ...} else if(条件){语句;语句1 ...} else{语句;语句1 ...}
Linux常用命令——awk
Linux常用命令——awk
二:语法一:for(初始化; 布尔表达式; 更新){语句}
语法二:for(变量 in 数组) {代码语句}
Linux常用命令——awk
三:while( 布尔表达式 ) {语句}
Linux常用命令——awk
四:do {代码语句}while(条件)
注意:do...while... 循环语句,即使不符合条件也会先执行一次
Linux常用命令——awk
五:continue 跳出 “当前” 循环,break 跳出 “整个” 循环
Linux常用命令——awk
Linux常用命令——awk
六:exit 与 next
exit 跳出 “整个 awk 命令”
Linux常用命令——awk
next 跳过当前行
Linux常用命令——awk

三元运算

注意:可以替代 if 语句中的 if(条件){语句;语句1 ...} else{语句;语句1 ...} 语法
1. 如图中例子,若条件为真,则用 系统用户:A 普通用户:B 来表示
Linux常用命令——awk
2. 统计 /etc/passwd 用户个数
Linux常用命令——awk
3. 打印奇偶行
注意:
1. awk 中,如果省略了模式对应的动作,当符合条件时,默认动作为打印整行,即{print $0}
2. awk 中,0 或空字符表示 “假”,非 0 或非空字符表示 “真”
如下: awk '{print $0}' one.txt 中,动作 {print $0} 前没有任何模式,并不表示空字符,而是表示 空模式,输出的没行都满足条件,匹配后的结果为真,即输出文本中的每行
Linux常用命令——awk
Linux常用命令——awk
明白了上面的内容,我们来打印 奇偶行 就容易理解了
Linux常用命令——awk
最后我们再来看一下 i 的值是多少
Linux常用命令——awk
awk数组
注意:
awk 中数组的下标可以是数字也可以是字符串(需要加双引号)

awk 中数组的下标默认是从 1 开始的
awk 中数组的本质是关联数组

1. 简单的数组
可以通过下标数字来取值,如:第一个例子
第二个例子说明空字符串是合法的
在直接引用不存在的元素时,awk 会自动创建一个空字符串,如:第三个例子
Linux常用命令——awk
2. 判断数组是否存在
Linux常用命令——awk
3. 使用 delete 删除数组
Linux常用命令——awk
4. 数组结合 for 循环实现遍历输出
Linux常用命令——awk
5. 实战
统计同一个 ip 出现的次数
Linux常用命令——awk
统计每个名字出现的次数
Linux常用命令——awk

转载于:https://blog.51cto.com/12384628/2287482

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值