• 每天进步一点点!

文章分类

推荐网站

常用手册

awk实用程序(四)【原创】

<<返回

2011-12-28 14:28:42

八、变量

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语句块儿,管道被关闭。注意,双引号中字符串必须最初打开的管道字符串命令完全一致。

 

上一篇:awk实用程序(三)

下一篇:awk实用程序(五)

文章评论

  • 暂无评论

发表评论

昵称:

内容:

发表评论