什么是awk
awk类似于sed,也是一种非交互式的文本编辑器
与sed的相同点:
- awk也是逐行读入,逐行处理
- awk只是将其处理结果送至stdout,不会修改任何输入文件
与sed的不同点:
- sed一般以整行为处理对象;而awk更善于处理分成多个逻辑“字段”的文本,即awk以“字段”为处理对象
awk的一般格式
awk [option] 'awk command' [file]
1.option即awk参数,常用的有:
- -F :设置FS(字段分隔符,后面介绍)的值,如:
awk -F":" 'awk command' [file] #将:设为FS(FS默认为一个或多个空格/Tab)
- -f :使用外部awk脚本执行awk,而不是使用awk command
2.awk command是awk的主体部分
首先要保证其被单引号包括,以避免与shell自带meta冲突
awk command的一般格式为:
[地址]{[操作]} #正则表达式和布尔表达式
{[地址][操作]} #if结构
- 地址:类似于sed,用于指定行号,有以下三种方式:
- /.../ :只处理正则表达式匹配的行
- 布尔表达式:只处理使布尔表达式的值为True的行,支持的条件测试有
- <
- >
- <=
- >=
- ==
- !=
- ~ :匹配正则表达式则返回True
- !~ :不匹配正则表达式则返回True
- if条件判断:结构与C语言类似。与上面两种方式不同的是,if结构放在花括号之内
awk -F":" '/tae|root/{print $0}' /etc/passwd #正则表达式
awk -F":" '$1=="tae"{print $0}' /etc/passwd #布尔表达式
awk -F":" '{if($1=="tae"){print $0}}' /etc/passwd #if结构
- 操作:目前仅用到print操作,对于print需要注意的是:与shell不同,若要用print打印除字段外的其他内容,需用双引号包括,如
awk -F":" '/tae|root/{print "This is from "$1}' /etc/passwd
1)awk中可以有多个awk command,它们在单引号内相互用空格分隔,形如
awk [option] '[awk command 1] [awk command 2]' [file]
2)在awk command中,可对同一地址进行多个操作,相互之间用分号分隔,形如
[地址]{[操作1]; [操作2]} #正则表达式和布尔表达式
{[地址]{[操作1]; [操作2]}} #if结构
3)地址和{之间没有空格
4)
地址不是强制要求的,若缺省则表示该awk command会对输入文件的每一行都进行处理
5)布尔表达式可以使用复合测试条件&&和||,如:
awk -F":" '($1=="tae")&&($2=="x"){print $0}' /etc/passwd
3.综上所述,awk的完整格式为:
awk [option] 'BEGIN{...} [地址 1]{[操作 1]; ...; [操作 n]} ... [地址 m]{[操作 1]; ...; [操作 n]} END{...}' [file]
字段变量
awk中
$0表示整个当前行
$1表示第一个字段,$2表示第二个字段,……以此类推
字段的分隔由FS决定
BEGIN和END
BEGIN:awk在开始处理文件之前会执行BEGIN块,因此BEGIN块一般用于初始化之后awk会用到的全局变量(如FS)
END块:awk在处理完所有行后会执行END块,因此END块一般用于执行最终计算或在输出流结尾处打印摘要信息
BEGIN和END不是强制要求的
全局变量
awk的全局变量主要用于捕获输入信息和格式化输出,主要有:
- FS:输入字段分隔符,默认为”一个或多个Space/Tab“,需要注意两点:
- FS不一定是单一字符
- FS可以是一个正则表达式
- OFS:输出字段分隔符(即取代print中的逗号),默认为空格,如
awk 'BEGIN{FS=":"} /tae/{print $1,$2,$3}' /etc/passwd #awk将默认地以空格分隔打印三个字段
awk 'BEGIN{FS=":"; OFS="---"} /tae/{print $1,$2,$3}' /etc/passwd #三个字段以"---"为分隔被打印
- RS:输入记录分隔符:告诉awk当前记录什么时候结束,新记录什么时候开始
- ORS:输出记录分隔符:默认为回车换行
- NF:用于记录当前行的字段的数量
- NR:用于记录当前行的行号
其他
awk会智能地将变量的值在字符串和数值之间转换
awk支持很多数值运算符,包括取模%,自增减,指数运算^
awk支持类似C语言的printf
awk捕获输入数据的准确性取决于FS和RS的设置