Linux之awk命令详解

mac2025-11-12  6

awk是一种编程语言,用于在linux/unix下对文本或数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

一、awk命令格式和选项

语法形式

awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) ​ 常用命令选项: -F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=value   赋值一个用户定义变量,将外部变量传递给awk -f scripfile 从脚本文件中读取awk命令

模式和操作

awk脚本是由模式和操作组成的。

模式

模式可以是以下任意一个:

/正则表达式/:使用通配符的扩展集。

关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。

模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

BEGIN语句块、pattern语句块、END语句块

操作

操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:

变量或数组赋值

输出命令

内置函数

控制流语句

二、awk脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

工作原理

第一步:执行BEGIN{ commands }语句块中的语句;

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

示例

[root@yfy ~]# echo -e "A line 1\nA line 2"|awk 'BEGIN{print "start"} {print} END{print "END"}' start A line 1 A line 2 END

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

三、将外部变量值传递给awk

借助-v选项,可以将外部值(并非来自stdin)传递给awk:

[root@yfy ~]# var=10000 [root@yfy ~]# echo | awk -v var1=$var '{print var1}' 10000

另一种传递外部变量方法:

[root@yfy ~]# var1="aaa" [root@yfy ~]# var2="bbb" [root@yfy ~]# echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 aaa bbb

四、设置字段定界符

默认的字段定界符是空格,可以使用-F "定界符" 明确指定一个定界符:

awk -F: '{ print $NF }' /etc/passwd 或 awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd

五、运算与判断

1.算术运算符

运算符描述+ -加,减* / &乘,除与求余+ - !一元加,减和逻辑非^ ***求幂++ --增加或减少,作为前缀或后缀

示例

[root@yfy ~]# awk 'BEGIN{a="b";print a++,++a}' 0 2 [root@yfy ~]# awk 'BEGIN{a="3";print a++,++a}' 3 5

注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0

2.赋值运算符

运算符描述= += -= *= /= %= ^= **=赋值语句

3.逻辑运算符

运算符描述||逻辑或&&逻辑与

示例

[root@yfy ~]# awk 'BEGIN{a=1;b=2;print (a>5&&b<=2),(a<4||b>3)}' 0 1

4.正则运算符

运算符描述~ ~!匹配正则表达式和不匹配正则表达式

示例

[root@yfy ~]# awk 'BEGIN{a="300test";if(a ~ /^300*/){print "ok";}}' ok [root@yfy ~]# awk 'BEGIN{a="300test";if(a ~! /^300*/){print "ok";}}'

5.关系运算符

运算符描述< <= > >= != ==关系运算符

示例

[root@yfy ~]# awk 'BEGIN{a=11;if(a>9){print "ok"}}' ok

注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

6.其它运算符

运算符描述$字段引用空格字符串连接符?:C条件表达式in数组中是否存在某键值

示例

[root@yfy ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' ok [root@yfy ~]# awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' 0 [root@yfy ~]# awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 1
最新回复(0)