Linux文本处理三剑客之-awk

awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。处理对象一般纯文本文件或纯文本信息。在开源界的awk是gawk(GNU)。在Linux中常使用的gawk,但是一般都称之为awk。

awk处理文本的过程如下:

1

基本的语法结构如下:

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 ""(默认会回车换行);

2

$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表示精度

3

2、awk变量

awk常见的变量有内置变量和自定义变量

2.1 内置变量

下面说明常见的内置变量


FS:Field Seperator, 输入时的字段分隔符,功能等价于参数-F。(注意下图字符串的连接)

OFS: Output Field Seperator, 输出时的字段分隔符;(默认是空格)

5

RS:Record Seperator, 输入行分隔符

ORS: Outpput Row Seperator, 输出时的行分隔符;

6

NF:Numbers of Field,字段数

NR:Numbers of Record, 行数;所有文件的一并计数;

7

FNR:行数;各文件分别计数;

8

ARGV:数组,保存命令本身这个字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk,

ARGC: 保存awk命令中参数的个数;

这2个变量类似于C语言中的可变参函数编程,将参数本身和参数个数保存起来,以便调用

9 

FILENAME: awk正在处理的当前文件的名称;

10

2.2 用户自定义变量

用户自定义变量可以定义在任何位置。在options中定义的话,可以使用-v参数。

ps:在BEGIN模式下定义变量的时候,注意要用“”问题。

11

3、awk模式

(1) Regexp: 格式为/PATTERN/  处理被/PATTERN/匹配到的行;

12

(2) Expression: 表达式,其结果为非0或非空字符串时满足条件;仅处理满足条件的行;

13

(3) Ranges: 行范围,此前地址定界,startline, endline   仅处理范围内的行,startline和endline使用模式

14 

单词锚定也可以使用如下方式:

17

(4) BEGIN/END: 特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次;

15

(5) Empty:空模式,匹配任意行;

4、awk的控制语句

4.1 if-else

格式:if (condition) {then body} else {else body}

16 

4.2 while

格式:while (condition) {while body} ,这里的循环指的是在循环field。

18

4.3 do-while循环

格式:do {do-while body} while (condition) ,执行过程是先进入循环,执行一次,在进行条件判断。其他的同while一样。

4.4 for循环

格式:for (variable assignment; condition; iteration process) {for body}

19

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默认情况下是会对行循环的)

20 

5、数组

用到最多的是关联数组,在统计数据时用到的会比较多。 数组使用时无需事先定义,可以直接使用。如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空串。

所谓,关联数组是数组的下标可是任意的字符。如果使用数字作为数字的下标的话,一般从1开始。

要遍历数组中的每一个元素,需要使用如下特殊结构:

for (var in array) {for body}

其var会遍历array的索引; 遍历的时候是随机的,不是按照特定的顺序

21

删除数组元素:

delete array[index]

6、awk的内置函数

split(string,array[,fieldsep[,seps]]) 功能:将string表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至array为名的数组中;数组下标从1开始; 此函数有返回值,返回值为切片后的元素的个数

length(string) 功能:返回给定字串的长度。如果string是数组名,返回的是数组的长度

23 

substr(string,start[,length]) 功能:从string中取子串,从start为起始位置为取length长度的子串;

24 

system(”shell 命令字符串”)函数:执行shell命名

26

7、awk的操作符

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

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

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

增强运算符:++、 --

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

比较操作符: <、<=、>、>=、==、!=

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

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

条件表达式:selector?if-true-expression:if-false-expression(三目运算符)

25

函数调用:function_name(argu1,argu2),当然用户也可以自定函数使用。

至此,awk的基本用法就介绍完成了,更多高级的用法可以通过man手册和官方文档


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章