awk 命令使用入门基础详解(4)

$ awk '{$2 = 100 + $1; print }' test #如果第二个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。 $ awk '$1 == "root"{$1 ="test";print}' test #如果第一个域的值是“root”,则把它赋值为“test”,注意,字符串一定要用双引号。

内建变量的使用。变量列表在前面已列出,现在举个例子说明一下:

$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test #把IGNORECASE设为1代表忽略大小写,打印第一个域是mary的记录数、第一个域、第二个域和最后一个域。

14.2. BEGIN模块

BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。例如:

$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test #在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。 $ awk 'BEGIN{print "TITLE TEST"}' #只打印标题。

14.3. END模块

END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。例如:

$ awk 'END{print "The number of records is" NR}' test #打印所有被处理的记录数(总行数)。

14.4. 重定向和管道

awk可使用shell的重定向符进行重定向输出,例如:

$ awk '$1 = 100 {print $1 > "output_file" }' test #如果第一个域的值等于100,则把它输出到output_file中。也可以用>>做追加操作。

输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。例如:

#执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。 $ awk 'BEGIN{ "date" | getline d; print d}' test #执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转化成数组mon,然后打印数组mon的第二个元素。 $ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test #命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 $ awk 'BEGIN{while( "ls" | getline) print}' #在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量name的值,print函数就被执行,END块打印See you和name的值。 $ awk 'BEGIN{printf "What is your name?" ; getline name < "/dev/tty"} $1 ~name {print "Found " name " on line " NR "."} END{print "See you," name "."}' test #awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。 #注意,如果文件不存在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。 $ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'

可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。例如:

$ awk '{print $1, $2 | "sort" } END {close("sort")}' test #awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。

system函数可以在awk中执行linux的命令。例如:

$ awk 'BEGIN{system("clear")}'

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11866.html