日期:2014-05-16  浏览次数:20682 次

Linux Shell常用技巧(四)

九.? awk实用功能:

?? ?和sed一样,awk也是逐行扫描文件的,从第一行到最后一行,寻找匹配特定模板的行,并在这些行上运行“选择”动作。如果一个模板没有指定动作,这些匹配的行就被显示在屏幕上。如果一个动作没有模板,所有被动作指定的行都被处理。
?? ?
?? 1.? awk的基本格式:
?? ?/> awk 'pattern' filename
?? ?/> awk '{action}' filename
?? ?/> awk 'pattern {action}' filename
?? ?
?? ?具体应用方式分别见如下三个用例:
?? ?/> cat employees
?? ?Tom Jones???????? 4424??? 5/12/66???????? 543354
?? ?Mary Adams????? 5346??? 11/4/63???????? 28765
?? ?Sally Chang?????? 1654??? 7/22/54???????? 650000
?? ?Billy Black???????? 1683??? 9/23/44???????? 336500

?? ?/> awk '/Mary/' employees?? #打印所有包含模板Mary的行。
?? ?Mary Adams????? 5346??? 11/4/63???????? 28765

?? ?#打印文件中的第一个字段,这个域在每一行的开始,缺省由空格或其它分隔符。
?? ?/> awk '{print $1}' employees
?? ?Tom
?? ?Mary
?? ?Sally
?? ?Billy
?? ?
?? ?/> awk '/Sally/{print $1, $2}' employees #打印包含模板Sally的行的第一、第二个域字段。
?? ?Sally Chang
?? ?
?? ?2.? awk的格式输出:
?? ?awk中同时提供了print和printf两种打印输出的函数,其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数 用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。下面给出基本的转码序 列:

转码 含义
\n 换行
\r 回车
\t 制表符


? ? /> date | awk '{print "Month: " $2 "\nYear: ", $6}'
?? ?Month: Oct
?? ?Year:? 2011

? ? /> awk '/Sally/{print "\t\tHave a nice day, " $1,$2 "\!"}' employees
?? ???????????????? Have a nice day, Sally Chang!

?? ?在打印数字的时候你也许想控制数字的格式,我们通常用printf来完成这个功能。awk的特殊变量OFMT也可以在使用print函数的时候,控制数字的打印格式。它的默认值是"%.6g"----小数点后面6位将被打印。
? ? /> awk 'BEGIN { OFMT="%.2f"; print 1.2456789, 12E-2}'
?? ?1.25? 0.12

?? ?现在我们介绍一下功能更为强大的printf函数,其用法和c语言中printf基本相似。下面我们给出awk中printf的格式化说明符列表:

格式化说明符 功能 示例 结果
%c 打印单个ASCII字符。