Chinaunix首页 | 论坛 | 博客
  • 博客访问: 585014
  • 博文数量: 109
  • 博客积分: 1463
  • 博客等级: 上尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-22 13:21
个人简介

希望和广大热爱技术的童鞋一起交流,成长。

文章分类

全部博文(109)

文章存档

2017年(1)

2016年(2)

2015年(18)

2014年(1)

2013年(9)

2012年(15)

2011年(63)

分类: LINUX

2012-05-02 16:23:46

awk重定向和管道

 转载地址来源:http://blog.sina.com.cn/s/blog_60c00c780100y3mi.html

 

1. BEGIN模块

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

 

如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test

 

上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。

 

2. END模块

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

 

如:$ awk 'END{print "The number of records is" NR}' test

 

上式将打印所有被处理的记录数。

 

3. 重定向和管道

awk可使用shell的重定向符进行重定向输出。

 

如:$ awk '$1 == 100 {print $1 > "output_file" }' test

 

上式表示如果第一个域的值等于100,则把它输出到output_file中。也可以用>>来重定向输出,但不清空文件,只做追加操作。

 

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

 

如:$ awk 'BEGIN{ "date" | getline d; print d}' test

执行linuxdate命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。

 

$ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test

执行shelldate命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给dsplit函数把变量d转化成数组mon,然后打印数组mon的第二个元素。

 

$ awk 'BEGIN{while( "ls" | getline) print}'

命令ls的输出传递给geline作为输入,循环使getlinels的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

 

$ 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

在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量name的值,print函数就被执行,END块打印See youname的值。

 

$ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'

awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。注意,如果文件不存在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真,注意关闭文件。

 

可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}awkprint语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。

 

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

如:$ awk 'BEGIN{system("clear")'

 

fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。

阅读(1641) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

kathy8705132012-05-10 16:57:43

g_programming: 这个.....
http://blog.chinaunix.net/uid-25324849-id-3079511.html
我是觉得这么像我整理的风格........
额。。。。你不早说,我都不晓得是你写的,早知道我就不满世界转了。。。

g_programming2012-05-03 17:17:16

这个.....
http://blog.chinaunix.net/uid-25324849-id-3079511.html
我是觉得这么像我整理的风格...