学习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 输入记录分隔符(默认为换行符)
执行脚本:
awk -f awk_inline_variable testfile.txt
注:testfile.txt内容见下文所述
执行结果:
二、一些小练习:
cat /etc/passwd
1、查看系统上有哪些用户
awk -F ":" '{print $1}' /etc/passwd
执行结果:
最开始的时候,写成打印print $0,结果总是打印出全部的文件,后来查资料才知道,分割后的字符串续写是从1开始的。
2、查看系统上的用户名和用户UID
awk -F ":" '{print "Username:" $1 "\t\tUID:"$3}' /etc/passwd
执行结果(部分结果):
3、格式化输出字符
做完上面的练习后,发现UID一栏并没有对齐,于是查找资料,发现awk中也有printf函数,这样就和C语言中的一样了,接着格式化输出一次上面的内容,username左对齐,UID右对齐。
awk -F ":" '{printf("Username:%-20s UID:%10d\n",$1,$3)}' /etc/passwd
执行结果(部分结果):
三、然后在网上找了道练习题:
文件名: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
2、显示Dan的电话号码
awk -F ":" '/Dan/{print $2}' testfile.txt
3、显示Susan的名字和电话号码
awk -F ":" '/Susan/{print $1 $2}' testfile.txt
4、显示以D开始的姓
awk -F "[: ]" '$2~/^D/{print $2}' testfile.txt
5、显示以一个C或E的名
awk -F " " '/^[CE]/{print $1}' testfile.txt
6、显示只有四个字符的名
awk -F " " 'length($1) == 4{print $1}' testfile.txt
7、显示区号916的人名
awk -F ":" '/\[916\]/{print $1}' testfile.txt
8、显示Mike的捐款,显示每个值时都有.250$100$175
awk -F ":" 'BEGIN{OFS="$"} /Mike/{print $3,$4,$5}' testfile.txt
9、显示人名其后跟一个逗号如Jody,Savage
awk -F "[: ]" '{print $1","$2}' testfile.txt
10、写一个awk的脚它的作用:
.显示Savage的全名和电话号码
.显示Chet的捐款
.显示头一个月捐款$250的人
awk -f awk_test testfile.txt