转载自董的博客html
1. 什么是awk正则表达式
awk是Unix/Linux提供的样式扫描与处理工具,很是擅长处理结构化数据和生成表单。与sed 和grep 很类似,但功能却超过大于二者,因为awk具有各类脚本语言的特色,因此也能够把它看作一种脚本语言。本文介绍了awk的使用方法。shell
2. awk程序设计模型编程
awk程序由三部分组成,分别为:初始化(处理输入前作的准备,放在BEGIN块中),数据处理(处理输入数据),收尾处理(处理输入完成后要进行的处理,放到END块中)。其中,在“数据处理”过程当中,指令被写成一系列模式/动做过程,模式是用于测试输入行的规则,以肯定是否将应用于这些输入行。函数
3. awk调用方式工具
主要有三种调用方式,分别为:测试
(1) awk 命令行this
你能够象使用普通UNIX 命令同样使用awk,在命令行中你也可使用awk 程序设计语言,,这种方法通常只用于解决简单的问题。固然,你也能够在shell script 程序中引用awk 命令行甚至awk 程序脚本。.net
(2) 使用-f 选项调用awk 程序命令行
awk 容许将一段awk 程序写入一个文本文件,而后在awk 命令行中用-f 选项调用并执行这段程序。
(3) 利用命令解释器调用awk 程序
利用UNIX 支持的命令解释器功能,咱们能够将一段awk 程序写入文本文件,而后在它的第一行加上#!/bin/awk –f.
4. awk语法
与其它 UNIX 命令同样,awk 拥有本身的语法:
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
(1) -F re:容许awk 更改其字段分隔符。
(2) parameter:该参数帮助为不一样的变量赋值。
(3) ‘prog’:awk 的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell 解释。这个程序语句段的标准形式为:’pattern {action}’
其中pattern 参数能够是egrep 正则表达式中的任何一个,它可使用语法/re/再加上一些样式匹配技巧构成。与sed 相似,你也可使用”,”分开两样式以选择某个范围。action 参数老是被大括号包围,它由一系列awk 语句组成,各语句之间用”;”分隔。awk 解释它们,并在pattern 给定的样式匹配的记录上执行其操做。你能够省略pattern 和action 之一,但不能二者同时省略,当省略pattern 时没有样式匹配,表示对全部行(记录)均执行操做,省略action时执行缺省的操做——在标准输出上显示。
(4) -f progfile:容许awk 调用并执行progfile 指定有程序文件。progfile 是一个文本文件,它必须符合awk 的语法。
(5) in_file:awk的输入文件,awk 容许对多个输入文件进行处理。值得注意的是awk 不修改输入文件。若是未指定输入文件,awk 将接受标准输入,并将结果显示在标准输出上。
5. awk脚本编写
5.1 awk的内置变量
awk中有两类内置的变量,一类用户可根据须要改变,主要有:FS:输入数据的字段分割符,RS:输入数据的记录分隔符,OFS:输输出数据的字段分割符,ORS:输出数据的记录分隔符;另外一类是系统自动改变的,如:NF:当前记录的字段个数,NR:当前记录编号等。
举例说明:
awk -F”:” ‘{ print $1 ” ” $3 }’ /etc/passwd #打印passwd中的第1,3个字段
5.2 pattern/action模式
awk程序部分采用了pattern/action模式,即,针对匹配pattern的数据,使用action逻辑进行处理。
举例说明:
/^$/ {print “This is a blank line!”} #判断当前是否是空格
$5 ~ /MA/ {print $1 “,” $3} #判断第5个字段是否是含有“MA”
NF == 3 { print “this particular record has three fields: ” $0 }
5.3 BEGIN和 END
在 awk中两个特别的表达式,BEGIN和 END,这二者均可用于 pattern中,提供 BEGIN 和 END 的做用是给程序赋予初始状态和在程序结束以后执行一些扫尾的工做。任何在 BEGIN 以后列出的操做(在{}内)将在 awk 开始扫描输入以前执行,而 END 以后列出的操做将在扫描彻底部的输入以后执行。所以,一般使用BEGIN来初始化变量,使用END 来输出最终结果。
例:累计销售文件xs 中的销售金额(假设销售金额在记录的第三字段) :
$awk
>’BEGIN { FS=”:”;print “统计销售金额”;total=0}
>{print $3;total=total+$3;}
>END {printf “销售金额总计:%.2f”,total}’ sx
5.4 循环语句
Awk中的循环语句与C很类似,包括do…while,for,continue/break,while等
5.5 条件语句
Awk中的条件语句与C类似,但它有更好地支持。
举例说明:
if(x ~ /[yY](es) ?/) print x #若是x符合pattern “[yY](es) ?”,则打印出来
{ if ( $0 !~ /matchme/ ) { print $1 $3 $4}} #若是$0不包含“matchme”,则打印第1,3,4个字段
5.6 函数
(1) 数学函数
Awk中包含丰富的数学函数,包括:cos(x),sin(x),log(x),….
(2) 字符串函数
Awk中包含丰富的字符串函数,如:
length(x):求字符串x的长度
index(t,s):返回字符串s在字符串t中的位置
match(s,r):正则表达式r在字符串s中出现位置
…
(3) 自定义函数
awk容许自定义函数,语法是:function name(parameter-list) {statements;}
如:
Function insert(STRING, POS, INS) {
before_tmp = substr(STRING, 1, POS)
after_tmp = substr(STRING, POS + 1)
return before_tmp INS after_tmp
}
调用方法:print insert($1, 4, “XX”)
6. Awk与shell混用
由于 awk 能够做为一个 shell 命令使用, 所以 awk 能与 shell 批处理程序很好的融合在一块儿,这给实现 awk 与 shell 程序的混合编程提供了可能。实现混合编程的关键是 awk 与shell script之间的对话, 换言之, 就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(一般是变量的值)、在 awk 中执行 shell 命令行、shell script 将命令执行的结果送给 awk处理以及 shell script读取 awk的执行结果等等。
6.1. awk读取Shell script程序变量
在awk中咱们能够经过“’$变量名’”的方式读取sell scrpit程序中的变量。
例如:读取shell scrpit程序中的变量name
下面给出两种方式:
第一种比较经常使用的方式:(双引号和单引号的意义须要明确)
#!/bin/sh
name=’John’
awk ‘{print $1,$2,”‘$name’”}’ myfile
————————————————-
第二种方式:
#!/bin/sh
name=’John’
awk ‘{print $1,$2,myname}’ myname=$name myfile
不过这种方式中,awk自定义变量myname不能在BEGIN中使用。
6.2. 将shell命令的执行结果送给awk处理
做为信息传送的一种方法,咱们能够将一条shell命令的结果经过管道线(|)传递给awk处理:
例:示例awk处理shell命令的执行结果
$who -u | awk ‘{printf(“%s正在执行%s\n”,$2,$1)}’
6.3. shell script程序读awk的执行结果
shell中能够将awk执行结果赋值给shell变量。咱们能够用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。固然也能够用管道线的方法将awk执行结果传递给shell script程序处理。
例如:找出myfile中带有fail字符串的行并统计行数,最后打印出格式为:there are (行数) lines
#!/bin/sh
temp=`awk ‘/fail/{print $0}’ myfile |wc -l`
echo “there are $temp lines
7. 参考资料
(1) http://fanqiang.chinaunix.net/program/other/2005-09-07/3621.shtml
(2) 《Unix awk使用手册》,做者:莫名 发表时间:2002/01/27 01:39pm
(3) 书籍《sed 与 awk》修订第三版
转载自董的博客