1.awk介绍
2.awk基本用法和工作原理
3.awk的运用说明
awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示。
在linux之上我们使用的是GNU awk简称gawk,并且gawk其实就是awk的链接文件,因此在系统上使用awk和gawk是一样。
通过man awk可以取得相关功能说明,还可以知道,gawk是一种过程式编程语言,支持条件判断、数组、循环等各种编程语言中所有可以使用的功能,因此我们还可以把awk称为一种脚本语言解释器。
gawk - pattern scanning and processing language:(模式扫描和处理语言)
基本用法:
格式1:awk [options] -f progfile [--] file ...
格式2:awk [options] [--] 'program' file ...
格式3awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
-f progfile,--file=progfile:从文件中来读取awk 的program
-F fs,--field-separator=fs:指明输入时用到的字段分割符
-v var=val,--assign=var=val:在执行program之前来定义变量
program:相当于编程语言,也就是处理后面文件的一系列操作语句
progfile:带有program或BEGIN等操作语句内容的文件
BEGIN:读取输入流前进行操作的标志
END:输入流读取完后进行操作的标志
pattern:模式,对输入流进行操作,实际上paogram就代表这pattern部分
action:动作语言,由多种语句组成,语句间用分号分割
工作原理:
从上面可以看到看似有三个格式,实际上总的来说就一个格式,就是格式3,因为格式1和2展开后,也就是格式3。
格式:awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
第一步:执行[option]相关内容,也就是-f,-F,-v选项内容。
第二步:执行BEGIN{action;… } 语句块中的语句。BEGIN 语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN 语句块中。
第三步:从文件或标准输入(stdin) 读取每一行,然后执行pattern{action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern 语句块,则默认执行{ print } ,即打印每一个读取到的行,awk 读取的每一行都会执行该语句块。
第四步:当读至输入流末尾时,也就是所有行都被读取完执行完后,再执行END{action;…} 语句块。END 语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END 语句块中完成,它也是一个可选语句块。
变量分为内置变量和自定义变量,但只要是变量都是用的选项-v。先选常用的内置变量说明下,然后说下自定义的变量。
内置变量:
FS:输入字段分隔符,默认为空白字符,这个想当于-F选项。分隔符可以是多个,用[]括起来表示,如:-v FS="[,./-:;]"
OFS:输出字段分隔符,默认为空白字符,分隔符可以是多个,同上
RS :输入记录(所认为的行)分隔符,指定输入时的换行符,原换行符仍有效,分隔符可以是多个,同上
ORS :输出记录(所认为的行)分隔符,输出时用指定符号代替换行符,分隔符可以是多个,同上
NF:字段数量
NR:记录数(所认为的行)
FNR :各文件分别计数, 记录数(行号)
FILENAME :当前文件名
ARGC:命令行参数的个数
ARGV :数组,保存的是命令行所给定的各参数
自定义变量(区分字符大小写):
在'{...}'前,需要用-v var=value:awk -v var=value '{...}'
在program 中直接定义:awk '{var=vlue}'
下面针对每个变量都举个例子:
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd awk –F: '{print $1,$3,$7}’ /etc/passwd awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd awk -v RS=' ' ‘{print }’ /etc/passwd awk -v RS="[[:space:]/=]" '{print }' /etc/fstab |sort awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd awk -F: ‘{print NF}’ /etc/fstab, 引用内置变量不用$ awk -F: '{print $(NF-1)}' /etc/passwd awk '{print NR}' /etc/fstab ; awk 'END{print NR}' /etc/fstab awk '{print FNR}' /etc/fstab /etc/inittab awk '{print FNR}' /etc/fstab /etc/inittab awk '{print FILENAME}’ /etc/fstab awk '{print ARGC}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab awk -v test='hello gawk' '{print test}' /etc/fstab awk -v test='hello gawk' 'BEGIN{print test}' awk 'BEGIN{test="hello,gawk";print test}' awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd awk -F: '{sex="male";age=18;print $1,sex,age}' /etc/passwd echo "{print script,\$1,\$2}" > awkscript awk -F: -f awkscript script=“awk” /etc/passwd 2.awk的print和printfprint和printf都是打印输出的,不过两者用法和显示上有些不同而已。
print 格式:print item1,item2, ...
printf格式:printf “FORMAT ”,item1,item2, ...