Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2414120
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: Python/Ruby

2012-02-22 12:06:02

awk重定向和管道

 

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中。也可以用>>来重定向输出,但不清空文件,只做追加操作。

建议在使用完重定向符号进行输出之后使用close(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")';其返回值是命令的退出状态码,首先它会清除所有的缓冲区输出,然后启动一个/bin/sh实例执行命令,启动新进程。
  • fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。

 

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