awk学习札记

  学习awk的时候,感觉awk和很多语言都有相似的地方,比如awk和LEX都是对输入串采用“模式{动作}”的方式进行相应的解析。但是不同的是,awk中有两个特殊的模式,一个是BEGIN,其只在开始的时候,执行一次,其他的时候不匹配,一般可以将初始化的工作交给它,有点类似于构造函数;另一个是END,其只在结束的时候执行一次,其可以用于输出统计的结果。

  awk中默认的变量是$0,代表输入的整行语句,比如/mark/{action},就相当于$0~/mark/{ation},这点和perl中的$_变量的作用很像,能提高程序编写的效率,但是同时也增加了维护的难度。

  awk的操作符和C语言的操作符非常的类似。

  awk自带了一些处理函数,比如说取某个字串,替换某个串等。

  awk中间有很多内置变量,对这些变量执行相应的读写操作能得到对应的结果。

一、编写一个脚本,熟悉下面列出的内置变量:

ARGC 命令行参数个数 
ARGV 命令行参数数组 
FILENAME string=当前输入的文件名 
FNR 在当前文件中当前记录数(对输入文件起始为1) 
FS 输入字段分隔符 
NF 当前记录的字段数 
NR 当前记录数(为全部输入文件) 
OFMT 数值的输出格式(默认为%.6g) 
OFS 输出字段的分隔符(默认为空格) 
ORS 输出记录分隔符(默认为换行符) 
RS 输入记录分隔符(默认为换行符)

wps_clip_image-622

执行脚本:

awk -f awk_inline_variable testfile.txt

注:testfile.txt内容见下文所述

执行结果:

wps_clip_image-700

二、一些小练习:

cat /etc/passwd

wps_clip_image-729

1、查看系统上有哪些用户

awk -F ":" '{print $1}' /etc/passwd

执行结果:

wps_clip_image-787

最开始的时候,写成打印print $0,结果总是打印出全部的文件,后来查资料才知道,分割后的字符串续写是从1开始的。

2、查看系统上的用户名和用户UID

awk -F ":" '{print "Username:" $1 "\t\tUID:"$3}' /etc/passwd

执行结果(部分结果):

wps_clip_image-937

3、格式化输出字符

做完上面的练习后,发现UID一栏并没有对齐,于是查找资料,发现awk中也有printf函数,这样就和C语言中的一样了,接着格式化输出一次上面的内容,username左对齐,UID右对齐。

awk -F ":" '{printf("Username:%-20s UID:%10d\n",$1,$3)}' /etc/passwd

执行结果(部分结果):

wps_clip_image-1123

三、然后在网上找了道练习题:

文件名:testdata.txt

Mike Harrington:[510] 548-1278:250:100:175

Christian Dobbins:[408] 538-2358:155:90:201

Susan Dalsass:[206] 654-6279:250:60:50

Archie McNichol:[206] 548-1348:250:100:175

Jody Savage:[206] 548-1278:15:188:150

Guy Quigley:[916] 343-6410:250:100:175

Dan Savage:[406] 298-7744:450:300:275

Nancy McNeil:[206] 548-1278:250:80:75

John Goldenrod:[916] 348-4278:250:100:175

Chet Main:[510] 548-5258:50:95:135

Tom Savage:[408] 926-3456:250:168:200

Elizabeth Stachelin:[916] 440-1763:175:75:300

上面的数据库中包含名电话号码和过去三个月里的捐款

1、显示电话号码

awk -F ":" '{print $2}' testfile.txt

wps_clip_image-1712

2、显示Dan的电话号码

awk -F ":" '/Dan/{print $2}' testfile.txt

wps_clip_image-1768

3、显示Susan的名字和电话号码

awk -F ":" '/Susan/{print $1 $2}' testfile.txt

wps_clip_image-1834

4、显示以D开始的姓

awk -F "[: ]" '$2~/^D/{print $2}' testfile.txt

wps_clip_image-1892

5、显示以一个C或E的名

awk -F " " '/^[CE]/{print $1}' testfile.txt

wps_clip_image-1949

6、显示只有四个字符的名

awk -F " " 'length($1) == 4{print $1}' testfile.txt  

wps_clip_image-2017

7、显示区号916的人名

awk -F ":" '/\[916\]/{print $1}' testfile.txt

wps_clip_image-2077

8、显示Mike的捐款,显示每个值时都有.250$100$175

awk -F ":" 'BEGIN{OFS="$"} /Mike/{print $3,$4,$5}' testfile.txt

wps_clip_image-2174

9、显示人名其后跟一个逗号如Jody,Savage

awk -F "[: ]" '{print $1","$2}' testfile.txt

wps_clip_image-2246

10、写一个awk的脚它的作用:

.显示Savage的全名和电话号码

.显示Chet的捐款

.显示头一个月捐款$250的人

wps_clip_image-2307

awk -f awk_test testfile.txt

wps_clip_image-2340

posted @ 2010-07-28 19:08  MR_H  阅读(1751)  评论(2编辑  收藏  举报