awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。处理对象一般纯文本文件或纯文本信息。在开源界的awk是gawk(GNU)。在Linux中常使用的gawk,但是一般都称之为awk。
awk处理文本的过程如下:
基本的语法结构如下:
awk [options] ‘PATTERN{action}’ file1 file2 …
下面从不同角度来说明,awk的用法。
1、awk的输出
常用的2个输出函数是print,printf函数,用于格式化输出。
1.1 print
print函数用法: print item1,item2,…
要点:
(1) 各项目之间使用逗号分隔,而输出时则使用输出分隔符(ORS)分隔,默认是空格;
(2) 输出的各item可以字符串或数值、当前记录的字段、变量或awk的表达式;数值会被隐式转换为字符串后输出;
(3) print后面item如果省略,相当于print $0;输出空白,使用pirnt ""(默认会回车换行);
$1,$7是以:为分隔符的第一个字段和第一个字段(Field),$0表示整行信息。
1.2 printf
printf函数用法: print format item1,item2,… 类似C语言中的printf函数。
要点:
(1) 要指定format;
(2) 不会自动换行;如需换行则需要给出\n
(3) format用于为后面的每个item指定其输出格式;
format格式一般都以%开头,常见的有:
%c | 显示字符ASCII码值 |
%d %i | 十进制的整数 |
%e %E | 以科学计数法显示数值 |
%f %lf | 显示浮点数 |
%g,%G | 以科学计数法或浮点数显示数值 |
%s | 显示字符串 |
%u | 显示无符号整形 |
%% | 显示%本身 |
格式也有修饰符,常见的修饰符有:
n(数字):显示宽度
-:左对齐,默认是由对齐
+:显示数值的符号
n1.n2:n1表示长度,n2表示精度
2、awk变量
awk常见的变量有内置变量和自定义变量
2.1 内置变量
下面说明常见的内置变量
FS:Field Seperator, 输入时的字段分隔符,功能等价于参数-F。(注意下图字符串的连接)
OFS: Output Field Seperator, 输出时的字段分隔符;(默认是空格)
RS:Record Seperator, 输入行分隔符
ORS: Outpput Row Seperator, 输出时的行分隔符;
NF:Numbers of Field,字段数
NR:Numbers of Record, 行数;所有文件的一并计数;
FNR:行数;各文件分别计数;
ARGV:数组,保存命令本身这个字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk,
ARGC: 保存awk命令中参数的个数;
这2个变量类似于C语言中的可变参函数编程,将参数本身和参数个数保存起来,以便调用
FILENAME: awk正在处理的当前文件的名称;
2.2 用户自定义变量
用户自定义变量可以定义在任何位置。在options中定义的话,可以使用-v参数。
ps:在BEGIN模式下定义变量的时候,注意要用“”问题。
3、awk模式
(1) Regexp: 格式为/PATTERN/ 处理被/PATTERN/匹配到的行;
(2) Expression: 表达式,其结果为非0或非空字符串时满足条件;仅处理满足条件的行;
(3) Ranges: 行范围,此前地址定界,startline, endline 仅处理范围内的行,startline和endline使用模式
单词锚定也可以使用如下方式:
(4) BEGIN/END: 特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次;
(5) Empty:空模式,匹配任意行;
4、awk的控制语句
4.1 if-else
格式:if (condition) {then body} else {else body}
4.2 while
格式:while (condition) {while body} ,这里的循环指的是在循环field。
4.3 do-while循环
格式:do {do-while body} while (condition) ,执行过程是先进入循环,执行一次,在进行条件判断。其他的同while一样。
4.4 for循环
格式:for (variable assignment; condition; iteration process) {for body}
for循环可用来遍历数组元素:
语法:for (i in array) {for body},常用。
4.5 case语句
语法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN},同C语言的case语句类似的格式。
4.6 循环控制
break 跳出本层循环
continue 直接进入到下一次循环中
4.7 next
提前结束对本行的处理进而进入下一行的处理;功能等价于contine(awk默认情况下是会对行循环的)
5、数组
用到最多的是关联数组,在统计数据时用到的会比较多。 数组使用时无需事先定义,可以直接使用。如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空串。
所谓,关联数组是数组的下标可是任意的字符。如果使用数字作为数字的下标的话,一般从1开始。
要遍历数组中的每一个元素,需要使用如下特殊结构:
for (var in array) {for body}
其var会遍历array的索引; 遍历的时候是随机的,不是按照特定的顺序
删除数组元素:
delete array[index]
6、awk的内置函数
split(string,array[,fieldsep[,seps]]) 功能:将string表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至array为名的数组中;数组下标从1开始; 此函数有返回值,返回值为切片后的元素的个数
length(string) 功能:返回给定字串的长度。如果string是数组名,返回的是数组的长度
substr(string,start[,length]) 功能:从string中取子串,从start为起始位置为取length长度的子串;
system(”shell 命令字符串”)函数:执行shell命名
7、awk的操作符
算术操作符:+、-、*、/、%
字符串操作符:字符串之间可以实现无缝连接。
赋值操作符:=、+=、-=、*=、/=、%=、**=
增强运算符:++、 --
如果模式自身是=号,要写为/=/
比较操作符: <、<=、>、>=、==、!=
~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假;!~: 模式取反
逻辑操作符:&&: 与 ||:或
条件表达式:selector?if-true-expression:if-false-expression(三目运算符)
函数调用:function_name(argu1,argu2),当然用户也可以自定函数使用。
至此,awk的基本用法就介绍完成了,更多高级的用法可以通过man手册和官方文档。