天天看点

Linux文本处理三剑客之-awk1、awk的输出2、awk变量3、awk模式4、awk的控制语句5、数组6、awk的内置函数7、awk的操作符

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>

算术操作符:+、-、*、/、%

字符串操作符:字符串之间可以实现无缝连接。

赋值操作符:=、+=、-=、*=、/=、%=、**=

增强运算符:++、 --

如果模式自身是=号,要写为/=/

比较操作符: &lt;、&lt;=、&gt;、&gt;=、==、!=

~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假;!~: 模式取反

逻辑操作符:&amp;&amp;: 与 ||:或

条件表达式: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,如需转载请自行联系原作者