当前位置:文档之家› genesis脚本编写10

genesis脚本编写10

第十章 awk 工具编程 我们在genesis 编程中,awk 工具会经常用到,awk 工具很强大,它不仅可以从一个很大的文本文件中抽取数据包,还可以进行算术运算、比较运算等等很多功能,应该说awk 是一种比较完整的编程语言,本章我们就一一介绍这个较为强大的工具。

刘才林数字签名人 刘才林DN :cn=刘才林,c=CN-中国,o=上海桌凯,ou=工程,email=hillohowareyougo@ 原因:我是该文档的作者日期: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}' 304.txt以上程序是在文件304.txt中查找包含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)}’结果等于2310.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 3genesis 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’test100 35 25100 X Y●打印第二个域的第5个字母为x的所有记录。

$awk ‘$2 ~/^...x/ testgenesis1 0005x002genesis2 0303x0325●打印第一个域为三个字母开头,就打印这个记录:$awk ‘$1~/^[a-z][a-z][a-z]/{print $1}’testabc00cds1210.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 + $6value = value * 3value+=3value = $5 - 8value*=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 环境变量关联数组●ERRNO 最后一个系统错误●FIELDWIDTHS 字段宽度列表●FILENAME 当前文件名●FNR 同NR,但相对于当前文件●FS 字段分割符号,默认为空格●IGNORECASE 如果为真,则进行忽略大小写匹配●NF 当前记录中的字段数●NR 当前记录数●OFMT 数字的输出格式(默认值是%g)●OFS 输出字段分隔符(默认值是空格)●ORS 输出记录分隔符(默认是一个换行符)●RLENGTH 由match函数所匹配的字符串长度●RS 记录分隔符号(默认为一个换行符号)●RSTART 由match函数所匹配的字符串的第一个位置●SUBSEP 数组下标分隔符(默认值是\034)10.9:BEGIN和ENDBEGIN和END两个模块在awk中非常有用,下面我们对它们进行详细介绍:10.9.1:BEGIN模块:BEGIN模块后面紧紧跟着动作块,它可以在没有任何输入的情况下进行测试,它通常用来初始化数值,设置参数等等,如:awk 'BEGIN{FS=","; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。

相关主题