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手册和官方文档。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1544200,如需转载请自行联系原作者
目录
相关文章
|
16天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
20 4
|
30天前
|
Linux Perl
Linux技巧|Awk 比较运算符
在 Awk 中,使用比较运算符(如 &gt;, &lt;, ==, != 等)可方便地过滤文本和字符串。本文通过示例展示了如何处理食品购物清单,标记数量小于或等于 20 的商品。 Awk 语法 `expression { actions; }` 用于根据条件执行操作,如在满足条件的行末尾添加特殊标记。例如,`$3 &lt;= 20 { printf &quot;%s\t%s\n&quot;, $0,&quot;TRUE&quot; ; }` 会在数量小于或等于 20 的行后添加 &quot;TRUE&quot;。继续探索 Awk 的比较运算符以进行更复杂的文本处理。
25 2
|
1月前
|
搜索推荐 Linux 开发工具
【Linux】深入理解awk命令
【Linux】深入理解awk命令
45 0
|
2月前
|
Linux Shell Perl
Linux下的Shell基础——文本处理工具(五)
Linux下的Shell基础——文本处理工具(五)
31 1
Linux下的Shell基础——文本处理工具(五)
|
2月前
|
Linux Perl
百度搜索:蓝易云【Linux常用命令awk】
以上仅是awk命令的一些常见用法,它还有许多更复杂的功能和用法,可以根据需要灵活运用。awk在文本处理和数据分析中非常实用,是Linux系统中的一把利器。
25 2
|
3月前
|
网络协议 关系型数据库 MySQL
Linux awk
Linux awk
30 0
|
3月前
|
监控 Linux BI
linux命令之awk
linux命令之awk
25 4
|
4月前
|
Unix Java Linux
Linux脚本中的字符处理与awk编程|WC统计
Linux脚本中的字符处理与awk编程|WC统计
46 0
|
5月前
|
存储 Linux Shell
Linux awk命令
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。 和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。awk 命令的基本格式为: [root@localhost ~]# awk [选项] '脚本命令' 文件名
73 1
|
6月前
|
Unix 测试技术 Linux
软件测试|Linux三剑客之awk命令详解
软件测试|Linux三剑客之awk命令详解
65 0