一、格式化输出
awk一大主要功能就是产生报表,报表就要按照预订的格式输出,awk借鉴C,也定义了printf输出语句,它可以规定输出的格式,printf基本语法如下:
printf(格式控制符,参数)
由上可知 printf语句包含两部分:①格式控制符,以 % 开始,描述格式规范;②参数列表,比如变量名列表,与格式控制符相对应,为输出对象。示例:
awk '{printf (“%s\t%d\n”,$2,$8)}' 输入文件
指令中,%s与$2对应,%d与$8对应。
格式控制符有分为printf修饰符 和格式符两种:
printf修饰符及意义
修饰符 |
意义 |
- |
坐对齐 |
width |
域的步长 |
.prec |
小数点右边的位数 |
Printf格式符及意义
格式符 |
意义 |
%c |
ASCII字符 |
%d |
整形数 |
%e |
浮点数,科学记数法 |
%f |
浮点数 |
%o |
八进制数 |
%s |
字符串 |
%x |
十六进制数 |
示例:awk '{printf(“%10.3f\n”,2009.1012)}'
其中, width = 10,表示浮点数长度控制在10位;.prec = .3,表示小数点后3位。
我们可以总结出printf修饰符一般的形式: %-width.prec 格式控制符。
二、内置字符串函数
awk提供了强大的内置字符串函数,用于实现文本的字符串替换、查找以及分隔功能:
awk字符串及意义
函数 |
意义 |
gsub(r,s) |
在输入文件中用s替换 r (作用于全部域 $0) |
gsub(r,s,t) |
在t中用s替换 r (作用于全部域 t) |
index(s,t) |
返回s中字符串第一个t的位置 |
length(s) |
返回s的长度 |
match(s,t) |
测试s是否包含匹配t的字符串 (成功,返回t的首位置;失败,返回0) |
split(r,s,t) |
在t上将r分成序列s(以t为分隔符,将r拆分成字符串数组s) |
sub(r,s,t) |
在t中第一次出现的r替换为s |
substr(r,s) |
返回字符串r中从s开始的后缀部分 |
substr(r,s,t) |
返回字符串r中从s开始长度为t的后缀部分 |
三、向awk脚本传递传递参数
awk脚本内的变量可在命令中进行赋值,实现像awk脚本传递参数,格式为:
awk脚本 parameter=value输入文件
变量赋值放在脚本之后,输入文件之前,=两端不能有空格。
awk所传递的参数可以是自定义变量,也可以是系统变量。
注意:命令行参数不能被BEGIN字段访问。
四、条件语句和循环语句
awk的条件语句和循环语句与C语言的语法完全相同。
可以使用~匹配符和正则表达式作为if语句的条件。示例:
if(x ~ /hel?o/) print x 若x中匹配模式 hel?o,将其打印
五、数组
awk数组的形式与C相同,但是,awk数组无需定义数组类型和大小,可以赋值后直接使用,
基本格式:
array[index] = value
关联数组
-
关联数组是指数组的索引可以是字符串,也可以是数字。关联数组在索引和数组元素之间建立起关联,
对每一个数组元素,awk自动维护了一对值:索引和数组元素值。关联数组的值无需以连续的地址进行存储,
所以,关联数组即便可以通过数字作为索引,但是,该数字索引并不表示数组存储地址的信息。awk的所以数组都是关联数组,这是awk数组与其他编程语言数组的本质区别。
字符串和数字之间是有明显差别的,例如,arry[09]和arry[9]二者就不能指定到数组中相同的值。
awk也特别定义了一种for循环来访问关联数组,语法形式:
for(variable in array)
dosomething with array[variable]
variable是任意指定的变量。
关键字in也可以在条件表达式中判断元素是否在数组中,语法格式如下:
indexin array
若array[index]存在,返回1,反之,返回0.
split(r,s,t)函数将字符串以t为分隔符,将r字符串拆分为字符串数组,并存放在s中。
数组形式的系统变量
awk系统变量中ARGV和ENVIRON,ARGC是ARGV数组中元素的个数,这一点和C相同。
ENVIRON的索引是环境变量名,可以通过环境变量名直接得到其值:
ENVIRON[“USER”]
ENVIRON[“OLDPWD”]
环境变量名要放到双引号里面。
本文完全参照 <linux shell 编程从初学到精通> 华清远见嵌入式培训中心 伍之昂等编著