基本用法
awk [-F fs] [-v var=value] 'program' [--] var=value file(s)
awk [-F fs] [-v var=value] 'BEGIN{actions} pattern{action} END{action}' var=value file(s)
awk [-F fs] [-v var=value] -f programfile var=value file(s)
-F选项时用来重新定义默认字段分隔符,且一般惯例将它作为第一个命令行选项。紧接在-F选项后的fs参数是一个正则表达式,或是被提供作为下一个参数。字段分隔符也可设置使用内建变量FS所指定的:awk -F '\t' '{}' files FS="[\f\v]" files 以上面的例子来看:-F选项设置的值,应用到第一个文件组,而由FS指定的值,则应用到第二个组。
初始化的-v选项必须放在命令行上直接给定的任何程序之前,它们会在程序启动之前以及处理任何文件之前生效。在一命令行程序之后的-v选项会被解释为一个文件名(可能是不存在的)。
在命令行上其他地方的初始化会在处理参数时完成,并且会带上文件名,例如:awk '{}' Pass=1 *.tex Pass=2 *.tex 处理文件的列表两次,第一次Pass设为1,第二次将它设为2。使用字符串值进行初始化无须用引号框起来,除非Shell要求这样的引用,以保护特殊字符或空白。
-- 是特殊选项,指出awk本身已没有更进一步的命令行选项,任何接下来的选项都能被你的程序使用。
特殊文件名-(连字号)表示标准输入。大部分现代的awk实现(但不包括POSIX)都认定特殊名称/dev/stdin为标准输入,即使主机操作系统不支持该文件名。同样:/dev/stderr与/dev/stdout可用于awk程序内,分别表示标准错误输出与标准输出。
变量定义
有三种类型的变量,包括有普通变量、内置变量、字段变量,其中只有普通变量是需要定义的,内置变量和字段变量都是awk在处理文件时内部设置的,不需要定义。普通变量在定义时遵循C语言的规则,即只能由字母、数字、下划线组成,而且变量开头只能是字母和下划线。与C语言不同的是,定义变量时不需要指定类型,由系统根据变量使用时的上下文去判断,未经初始化的变量值为0或"",数值型变量直接使用=赋值即可,字符串则需要把值用""包裹起来。比如:num=238.5,num="五"。
数值型变量和字符串变量之间可以互换,使用如下的方法。字符串转为数字:num + 0 ,数字转为字符串:num + ""。必要时,awk会将字符型变量转换为数值型变量,或者反向转换。对变量赋值使用awk的赋值运算符,= += -= /= *= %= ^= 。
字段变量可以和普通变量一样使用,唯一的区别是他们引用了字段,新的字段可以使用赋值来创建。字段变量引用的字段如果没有值,则被赋值为空串。字段的值发生变化时,awk会以OFS的值作为字段分隔符重新计算$0变量的值。字段数目通常被限制在100以内。
内置变量
ARGC ARGC表示命令行中传入awk脚本的参数个数,至少一个(awk命令本身。
ARGV ARGV是ARGC的参数排列数组,其中每一元素表示为ARGV[n],n为期望访问的命令行参数,0是特殊值,表示awk命令本身。
ENVIRON ENVIRON支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如ENVIRON["EDITOR"]="Vi"。
FILENAME FILENAME支持awk脚本实际操作的输入文件。因为awk可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。
FNR FNR支持awk目前操作的记录数。其变量值小于等于NR。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。
FS FS用来在awk中设置域分隔符,与命令行中-F选项功能相同。缺省情况下为空格。如果用逗号来作域分隔符,设置FS=","。
NF NF支持记录域个数,在记录被读之后再设置。
NR 已读的记录数
OFS OFS允许指定输出域分隔符,缺省为空格。如果想设置为#,写入OFS="#"。
ORS ORS为输出记录分隔符,缺省为新行(\n)。
RS RS是记录分隔符,缺省为新行(\n)。
变量传递(与shell变量交互)
awk的-v开关指出将要设置一个变量,紧接着-v开关的是将在awk中赋值的变量。
为了打印第3个字段值,我们可以使用以下的语句:
Count=3
echo"a,b,c"|awk-v num=$Count'{print $num}'
-v开关是对变量赋值的一个较新的选项,在要求可移植性的时候,它可能不是理想的选择。在这种情况下,就需要下面的技巧。
Count=3
echo"a,b,c"|awk'{print $num}'num=$Count
在awk脚本中可以使用这些变量,就好像是他们在脚本中生成的一样。注意,如果命令行中filename的位置在变量之前,这些变量将不能在BEGIN语句中使用。
关联数组
数组在awk中称为关联数组,因为它的下标既可以是数字也可以是字符串。下标通常又称作键(key),并且与对应的数组元素的值相关联。数组元素的键和值都存储在awk程序内部的一个表中,该表采用的是散列算法。正是由于使用了散列算法,所以数组元素不是顺序存储的,如果将数组的内容显示出来,元素的排列顺序也许跟想象中的不一样。和变量一样,数组也是被用到时才被创建,而且,awk还能判定这个数组用于保存数字还是字符串。根据使用时的上下文环境,数组元素被创建为数字0或空字符串。数组的大小不需要声明。
特殊for循环
当下标为字符串或非连续的数字时,不能用for循环来遍历数组。这时候就要使用特殊for循环。特殊for循环把下标作为键来查找与之关联的值。
for(item in arrayname){
print arrayname[item]
}
用字符串作为数组下标
数组下标可以由单个字符或字符串的变量组成,如果是字符串,则必须使用双引号引起来。
count["2"]++
使用字段的值作为数组下标
任何表达式都可以用作数组的下标。所以,也可以用字段作下标。
count[$2]++
数组与split函数
awk的内置函数split能够将字符串拆分为词,然后保存在数组中。您可以指定字段分隔符,也可以使用FS的当前值。
split(字符串,数组,字段分隔符)
split(字符串,数组)
split("3/15/2004",date,"/")
数组与delete函数
delete函数用于删除数组元素。
awk'{line[x++]=$2}END{for(x in line) delete(line[x])}'filename

被折叠的 条评论
为什么被折叠?



