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