第十章                                    awk 工具编程 我们在genesis 编程中,awk 工具会经常用到,awk 工具很强大,它不仅可以从一个很大的文本文件中抽取数据包,还可以进行算术运算、比较运算等等很多功能,应该说awk 是一种比较完整的编程语言,本章我们就一一介绍这个较为强大的工具。
刘才林数字签名人 刘才林DN :cn=刘才林,c=CN-中国,o=上海桌凯,ou=工程,email=hillohowareyougo@126 原因:我是该文档的作者日期:2008.07.03 10:07:27 +08'00'
10.1:awk简介:
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它可以在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
Awk后来在Linux系统上发展为gawk,在unix系统上发展为nawk,而在genesis2000编程的windows系统中,我们要应用awk95,它们之间也有一些区别,如果你编写的genesis2000程序要应用于多个系统,请注意您的awk程序是否能在各个系统中运行,并且定义不同系统为不同的awk,因为最早的awk很多功能都不能实现。下面的讲解以gawk为主,但我们简称为
awk,请大家不要混淆概念。
10.2:awk命令格式和选项:
10.2.1:awk的语法有两种形式:
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
10.2.2:awk的常用选项:
●–F fs:使用fs作为输入记录的字符分隔符,如果省略该选项,awk使用环境变量
IFS的值。
●–f  filename:从文件filename中读取awk_scripts。
●–v 为awk_script设置变量。
10.3:awk的调用方式:
awk的调用方式可分为三种:
(1):直接写成命令行(在awk程序很短的情况下)
(2):将awk_scripts放入脚本并以#!/bin/awk 作为开头,给予它可执行权限,然后执行程序。
(3):将awk程序插入一个单独脚本文件,然后用:awk –f进行调用。
10.4:模式和动作:
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件,处理即对数据进行的操作,如果省略模式部分,动作将时刻保持执行状态;如果动作被省略,则缺省的动作被执行,既显示出所有符合模式的输入行而不做任何的改动。
10.4.1:模式:
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和END。
使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,awk总是匹配或打印行数。
10.4.2:动作:
动作都在{}内,主要分为四个部分:
●变量或数组赋值:
●输出命令:
●内置函数:
●控制流命令:
10.4.3:范例:
●awk '/genesis/' /etc/passwd
上面的程序在/etc/passwd中寻符合genesis的记录,并显示出来,该例子中没有动作,所以缺省的动作被执行。
●awk '/genesis/{print $1}'
以上程序是在文件中查包含genesis字符串的记录,并且打印这些记录的第一行。
10.5:运算符号:
10.5.1:比较运算:
下面我们先列出awk的比较运算符号:
●==      相等
●!=      不等于
●<        小于
●>        大于
●<=      小于等于
●>=      大于等于
awk可以进行带有小数点的比较,下面我们举例说明:
echo 2.3 3.2|awk ‘{if($1<$2)print 1;else print 2}’
则结果会显示1。
10.5.2: 逻辑运算式:
下面我们列出逻辑运算符号:
●||      逻辑或
●&&      逻辑与
●!      逻辑否
10.5.3:正则表达式符号:
●~        匹配正则表达式。
●~!      不匹配正则表达式。
10.5.4:数值运算符号:
●+          加法运算
●-          减法运算
●*          乘法运算
●/          除法运算
●%          求余数
●=          赋值
●^          求幂
●**        求幂
●+=        将变量加一个数再将此值赋给变量
●-=        将变量减一个数再将此值赋给变量
●++        将变量值加1
●--        将变量值减1
●*=        将变量乘以一个数再将此值赋给变量
●/=        将变量除以一个数再将此值赋给变量
●%=        将变量求余后再将余数赋给变量
●^=        将变量求幂后再将结果赋予给变量
下面我们举例进行说明:
(1): 将数值10进行3次立方:
echo 10|awk ‘{print ($1^3)}’
结果为1000
(2):将数值5乘以3加上8:
正则匹配多行echo 5|awk ‘{print ($1*3+8)}’
结果等于23
10.6:记录、域:
在awk中如果我们要对文本进行操作,就要特别注意记录、域的概念,下面我们分别进行讲述:
10.6.1:记录:
●awk把每一个以换行符结束的行称为一个记录。
●记录分隔符:默认的输入和输出的分隔符号都是回车,保存在内建变量ORS和RS中。
●$0变量:它指的是整条记录,如awk ‘{print $0}’ test将输出test文件中的所有记录。
●NR:行号:一个计数器,每处理完一条记录,NR就会加1,我们也可以固定打印某行的记录:
如cat xx|awk -F '{if(NR==1)print $0}',则打印xx文件的第一行的记录。
10.6.2:域:
●  记录中每个单词称为“域”,默认情况下以空格或tab分隔,awk可跟踪域的个数,并在
内建变量NF中保存该值,如awk ‘{print $1,$5}’ test 则将打印test第一个和第三个空
格分开的列。
●  域分隔符:内建变量FS保存输入域分隔符的值,默认是空格或TAB,我们可以通过-F命
令行选项参数修改FS的值,如awk –F:‘{print $1,$5}’ test则将打印以冒号为分隔符
的第一和第五列的内容。
●  可以同时使用多个域分隔符,这时应该把分隔符写成到方括号中,如awk –F
‘[:\t]’’{print $1,$3}’ test’表示以空格、冒号和TAB作为分隔符。
10.7:正则表达式:
在grep一章中,有许多例子用到正则表达式,这里将不使用同样的例子,但可以使用条件操作讲述awk中正则表达式的用法。
这里正则表达式用斜线括起来。例如,在文本文件中查询字符串genesis,使用/genesis/可以查出单词genesis的出现情况。
10.7.1:元字符:
awk的元字符包括下面一些符号:
\ ^ $ . [] | () * + ?
元字符的具体解释可以参照前面的章节,但其中有两个符号在前面没有提到,因为它们只适合与awk,它们为“+”和“?”
●+ 使用匹配一个或者多个字符。
●?匹配模式出现的频率。
10.7.2:范例:
●查文件test中第一个字段为genesis的记录,并打印它们的整个行:
cat test|awk –F’’’{if($1==”genesis”)print $0}’
genesis 2 3
genesis 3 5
●查文件scripts中第一个字段不为set的记录,并打印它们整个行:
cat scripts|awk –F’’’{if($1!=”set”)print $0}’
echo “$1”
echo “this is value”
●打印文件中所有以X或者Y开头的记录:
$awk ‘/^(X|Y)/’ test
●如果第一个域是一个数值,并等于100则打印这个记录:
$awk  ‘$1==100’test
100 35 25
100 X Y
●打印第二个域的第5个字母为x的所有记录。
$awk ‘$2 ~/^...x/ test
genesis1 0005x002
genesis2 0303x0325
●打印第一个域为三个字母开头,就打印这个记录:
$awk ‘$1~/^[a-z][a-z][a-z]/{print $1}’test
abc00
cds12
10.8:变量:
10.8.1:普通变量:
在awk中,变量不需要进行定义而可以直接使用,变量类型可以是数字或字符串:
赋值的格式为:variable=expression:
请看下面的例子:
$1 == "genesis" {value = value + 1 }
如果第一个字段是genesis,则value的值加1。在此之前,我们应当给value赋予过初值,一般
是在GEGIN部分。
下面是比较完整的例子:
BEGIN { value = 0 }
$5 == "genesis" { value = value + 1 }
END { printf "%d occurrences of genesis were found",value }
变量可以和字段和数值一起使用,所以,下面的表达式均为合法:
value = value + $6
value = value * 3
value+=3
value = $5 - 8
value*=3
变量也可以是格式的一部分,例如:
$1 > max_value {print "this max value exceeded by ",$1 - max_value}
$3 - var1 < min_value {print "this Illegal value of ",$3 }
10.8.2:环境变量:
awk的环境变量比较多,下面我们先描述它们各自的功能:
●$n            当前记录的第n个字段
●$0            完整的当前记录
●ARGC          命令行参数的数目
●ARGIND        命令行中当前文件的位置
●ARGV          包含命令行参数的数组
●CONVFMT      数字转换格式(默认为%g)
●ENVIRON      环境变量关联数组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。