八、变量
1.数值变量和字符串变量
数值数字可以是整数、浮点数和科学计数法表示的数(如:.723E-1, 3.4e7),字符串则扩在双引号中。
初始化:只要在awk程序中被提到,变量就开始存在,变量可以是一个字符串或一个数字,也可以即是字符串又是数字。变量被设置后就会变成与等号右边那个表达式相同的类型。未经初始化的变量时0或“”
强制类型转换:如果把一个字符串强制转换成数字,方法为:变量名+0;如果要把一个数字转化为字符串方法为:变量名 ""(变量名后跟一个空格和一个空字符串);
2.用户自定义变量
变量名可以是字母,数字和下划线,但不能以数字开头。不用声明变量类型,awk会自动判断。如果变量为初始化,awk会将字符串初变量始化为空字符串,数值变量初始化0;
3.字段变量
新的字段可以通过赋值来创建,字段变量引用的字段如果没有值责备赋值为空串,字段的值发生变化时,awk会以OFS
的值作为字段分隔符重新计算$0变量的值,字段数目最多限制在100以内。
例:awk '{$5 = $3 * 1000 / 2 ; print}" filename
说明:如果不存在第五个字段($5),awk会创建它并将$3 * 1000 / 2的值赋给它,如果存在第五个字段,awk直接将表达式的值赋给它,替换掉原来的内容。
例:
awk '$4 == "ABC" {$4 = "abc" print}' filename
说明:如果$4的值为ABC,则将其替换为abc。注意:这里的双引号是必须的,如果没有双引号,awk认为ABC是用户自定义的变量。
4.内置变量
变量 |
含义 |
变量 |
含义 |
---|---|---|---|
ARGC |
命令行参数数目 |
ARGV |
命令行参数组成的数组 |
ENVIRON |
包含当前shell环境变量值的数组 |
FILENAME |
当前输入文件的文件名 |
FNR |
当前文件的记录数 |
FS |
输入字段分隔符,默认为空格 |
NF |
当前记录中的字段数 |
NR |
目前的记录数 |
OFMT |
数字的输出格式 |
OFS |
输出字段分隔符 |
ORS |
输出记录分隔符 |
RLENGTH |
math函数匹配到的字符串长度 |
RS |
输出记录分隔符 |
RSTART |
math函数匹配到的字符串的偏移量 |
SUBSEP |
数组下标分隔符 |
|
|
5.BEGIN模式
BEGIN模式后跟一个操做块。awk必须在对输入文件执行任何操作前执行该操作块,BEGIN操作常常被用作修改内置变量(OFS、FS、RS等)。
例:
awk 'BEGIN{FS=":"; OFS="\t"} {print $1, $2, $3}' filename
6.END模式
END模式不匹配任何输入行,而是执行任何与之关联的操作。awk执行完所有输入行后才处理END模式。
例:
awk 'END{print "The number of recode is : " NR} ' test_awk.txt #6
例:
awk '/ABC/{count++}END{print "ABC was found : " count " times"} ' test_awk.txt #ABC was found : 2 times
九、重定向
1.输出重定向
例:
awk '$1 ~ /^[0-9]/ {print $0 > "/root/num_awk"}' test_awk.txt
说明:如果test_awk.txt中的第一个字段是数字开头,则将该条就来输出(重定向)到root目录下的num_awk文件中,此处的双引号不可省略。
2.输入重定向getline)
getline函数用于从标准输入、管道或文件(非当前处理的文件)读取输入。getline用于读取下一输入行,并且设置内置变量NF,NR,FNR的值。如果读到一条记录,函数返回1,如果读到EOF(end of file, 文件尾),函数返回0,如果发生错误,如打开文件失败,函数返回0。
例:
awk 'BEGIN{"whoami" | getline shell ; print shell}' #root
说明:先执行 whoami的命令,将输出通过管道传个getline函数,再通过getline经结果传递给用户自定义的函数shell,最后打印shell的内容。
例:
awk 'BEGIN{while("ls" | getline) print}' #anaconda-ks.cfg #Desktop #install.log #install.log.syslog #test_awk.txt
说明:ls的输出将传递给getline,每循环一次,getline就从ls的输出读取一行,并将其打印在屏幕上。
注意:此处的ls如果换成ll将会出错,另外while循环与print之间没有分号。
十、管道
awk程序可以使用管道处理对输入文件做进一步处理。
例:
awk '{print $1, $2 | "sort -r +0 -1 +1 -2"}' test_awk.txt #You are #That's a #ABC Def #ABC Def #abc def #123 456
说明:awk将print的输出传递给sort最为sort的输入。sort对该输入用第一个字段作为主键,第二个字段作为次主键做逆向排序,将输出结果打印在屏幕上。
关闭文件和管道:如果打算在awk程序中再次使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。注意,管道一旦打开,就会保持打开状态直到awk退出。因此,END语句块也会受到管道的影响。
例:
awk '{print $1, $2 | "sort -r +0 -1 +1 -2"}END{close ("sort -r +0 -1 +1 -2")}' test_awk.txt #You are #That's a #ABC Def #ABC Def #abc def #123 456
说明:执行到END语句块儿,管道被关闭。注意,双引号中字符串必须最初打开的管道字符串命令完全一致。