Linux awk命令
目录
一.awk是什么
awk 不仅仅时 linux 系统中的一个命令,而且是一种编程语言,可以用来处理数 据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准 输入,也可以通过管道获取标准输入,awk 可以在命令行上直接编辑命令进行操 作,也可以编写成 awk 程序来进行更为复杂的运用。本章主要讲解 awk 命令的 运用。awk在工作中很多时候被用来处理log文件,进行一些统计工作等。
二.awk的格式
- 参数 -F 指定分隔符,指定awk按照什么标志进行文件的切割,切割成一列一列的。(如果不指定-F参数,awk默认按照空格进行分割)
- awk 指令是由模式,动作,或者模式和动作的组合组成。
- 模式既 pattern,可以类似理解成 sed 的模式匹配,可以由表达式组成,也可 以是两个正斜杠之间的正则表达式。比如 NR==1,这就是模式,可以把他理 解为一个条件。
- 动作即 action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。
awk -F "[ ]+" '{print NR,$1}' file |
- [ ] 多个分隔符 [ ]+贪婪模式
- $1 代表取第一列 $0 默认全输出
- NR 显示第一列行号
2.1 特殊模式
2.1.1 正则表达式模式
awk 同 sed 一样也可以通过模式匹配来对输入的文本进行匹配处理。说到模式 匹配,肯定少不了正则表达式,awk 也支持大量的正则表达式模式,大部分与 sed 支持的元字符类似,而且正则表达式是玩转三剑客的必备工具,下表列出了 awk 支持的正则表达式元字符:
符号 |
功能 |
^ | 以 开头 |
$ | 以 结尾 |
. 点 | ..匹配 后边的任意两个字符 |
* | |
+ | 重复前一个字符一次或多次 |
? | 匹配0个或一个前边的字符 |
[] | 匹配只当字符组内的任意一个字符 |
[^] | 不匹配指定组里的字符 |
() | 子表达式组合 |
| | 或的意思 |
awk 默认不支持的正则 参数:--posix
x{m} | 匹配x m次 |
x{m,} | 匹配x至少m次 |
x{m,n} | 匹配x至少m次最少N次 |
awk正则操作符
~ | 对区域的表达式进行匹配 |
!~ | 取反 ~ |
- 正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行 action 操作,但是有时候仅需要固定的列来匹配指定的正则表达式,比如:我想取 /etc/passwd 文件中第五列{$5}这一列查找匹配 mail 字符串的行,这样就需 要用另外两个匹配操作符,并且 awk里面只有这两个操作符来匹配正则表达式。
示例
模板
正则输出 取包含Zhang的整行
取出某一行
- $2~ 第二列 正则
- /^B/匹配开头以B的
2.1.2 练习
练习题 1:显示姓 Zhang 的人的第二次捐款金额及她的名字
练习题 2:显示 Xiaoyu 的名字和 ID 号码
练习题 3:显示所有以 41 开头的 ID 号码的人的全名和 ID 号码
练习题 4:显示所有以一个 D 或 X 开头的人名全名
练习题 5:显示所有 ID 号码最后一位数字是 1 或 5 的人的全名
练习题 6:显示 Xiaoyu 的捐款,每个值都有以$开头。如 $520$135
练习题 7:显示所有人的全名,以姓,名的格式显示,如 Meng,Feixue
2.1.2 比较表达式模式
比较表达式元字符
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
> | 大于 |
运算符
~ | 与正则表达式 |
!~ | 与正则表达式不匹配 |
2.1.3 范围模式
匹配从条件 1 开始到条件 2 介绍的范围
2.1.4 特殊模式
awk [options] 'BEGIN{ commands } pattern{ commands } END{ commands }' file |
BEGIN 模块 在awk读取前执行,可以定义内置变量,可以输出表头,只执行一次
END 模块 awk读完所有文件的时候,在执行END模块,输出一个结果,只执行一次
echo -e '1\n2\n3' | awk 'BEGIN{print "begin"}{print $1}END{print "end"}'
输出:
begin
1
2
3
end
三.awk数组
awk 提供了数组来存放一组相关的值。 awk 是一种编程语言,肯定也支持数组的运用,但是又不同于 c 语言的数组。数 组在 awk 中被称为关联数组,因为它的下标既可以是数字也可以是字符串。
for (i in h) print i,h[i]
- i 代表变量(元素名)
- h 数组名
求文件行数
去重求和
四.awk的内置变量
awk中同样定义了很多内置变量,我们可以直接像使用普通变量一样使用他们,由于awk的版本众多,有些内置变量并不是得到所有awk版本的支持。
NF 表示字段数,在执行过程中对应于当前的字段数
NR 表示记录数,在执行过程中对应于当前的行号
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认是一个换行符)