《Linux命令行与shell脚本编程大全》 第二十一章 学习笔记
第二十一章:gawk进阶
使用变量
gawk支持两种类型的变量:
内建变量
自定义变量
内建变量
字段和数据行分割符变量
使用美元符号($)和数据字段在数据行中位置对应的数值来引用该数据行中的字段。
比如,要引用数据行中的第二个字段就使用$2
gawk数据字段和数据行变量
变量描述FIELDWIDTHS由空格分隔开的定义了每个数据字段确切宽度的一列数字FS输入字段分割符RS输入数据行分割符OFS输入字段分隔符ORS输入数据行分隔符OFS默认值为空格
一旦设置了FIELDWIDTHS,FS就会失效一旦设置了FIELDWIDTHS值,就不可再更改
下面演示一下RS
假设我们有一份联系人名单,每个联系人之间用空行分割,格式如下
数据变量变量描述ARGC当前命令行参数个数ARGIND当前文件在ARGV中的位置ARGV包含命令行参数的数组CONVFMT数字的转换格式(参见print语句);默认值为%.6 gENVIRON当前shell环境变量及其值组成的关联数组ERRNO当读取或关闭输入文件发生错误时的系统错误号FILENAME用作gawk输入数据的数据文件的文件名FNR当前数据文件中的数据行数IGNORECASE设成非0值时,忽略gawk命令中出现的字符串的字符大小写NF数据文件中的字段总数NR已处理的输入数据行数目OFMT数字的输出格式;默认值为%.6 gRLENGTH由match函数所匹配的子字符串的长度RSTART由match函数所匹配的子字符串的起始位置在gawk中引用gawk变量的时候,不需要美元符号
注意:gawk后的脚本不算参数我们可以通过如下方式获取系统环境变量,既而在gawk中使用。
注意:这里gawk先把NF计算出来,然后再执行$number,而不是像shell中把$NF视为对NF变量的引用。下面看一下FNR与NR的区别
自定义变量在脚本中给变量赋值
同shell中的变量赋值类似:
还可以在其中直接进行数学运算可以直接进行求余(%)和方幂(**或者^)运算在命令行上给变量赋值
可以在gawk脚本之外给gawk中变量赋值
但是这个变量在BEGIN中是无效的,如果想在BEGIN中生效,需要使用-v选项。处理数组gawk使用关联数组来提供数组功能,它的索引可以是任意文本字符串。
定义数组变量
遍历数组变量可以使用for语句:
删除数组变量delete array[index]
使用模式BEGIN和END是用来在读取数据流之前或之后执行命令的特殊模式。
正则表达式
正则表达式必须出现在它要控制的程序脚本的左花括号前:
匹配操作符(matching operator)匹配操作符允许将正则表达式限定在数据行中的特定数据字段。匹配操作符是波浪线(~)。需要一起指定匹配操作符、数据字段变量以及正则表达式:
可以使用!~来过滤没有满足正则表达式的字符串。数学表达式可以使用下面几种形式:
x == y
x <= y
x < y
x > y
x >= y
这里不仅局限于数值比较,也可以作用在字符串上。
结构化命令if语句
语句格式:
while语句语句格式:
do-while语句语句格式:
for语句gawk支持C风格的for循环
语句格式:
格式化打印printf命令格式:
printf "format string", var1, var2 ...
gawk程序会将每个格式化指定符作为命令中列出的每个变量的占位符使用。第一个格式化指定符会匹配列出的第一个变量,第二个会匹配第二个变量,依此类推。
格式化指定符采用如下格式:
%[modifier]control-letter
其中control-letter指明显示什么类型数据值的单字符码,而modifier定义了另一个可选的格式化特性。
格式化指定符的控制字母
控制字母描述c将一个数作为ASCII字符显示d显示一个整数值i显示一个整数值(跟d一样)e用科学记数法显示一个数f显示一个浮点值g用科学记数法或浮点数中较短的显示o显示一个八进制值s显示一个文本字符串x显示一个十六进制值X显示一个十六进制值,但用大写字符A-F除了控制字母外,还有3种修饰符可以用来进一步控制输出。
width:指定了输出字段最小宽度的数字值。如果短于这个值,printf会向右对齐,并用空格来填充这段空间。如果输出比指定的宽度还要长,它就覆盖width值。
prec:指定了浮点数中小数点后面位数的数字值,或者文本字符串中显示的最大字符数。
-(减号):向格式化空间中放入数据时采用左对齐。
printf每打印一次,不会自动换行。
内建函数gawk数学函数
函数描述atan2(x,y)x/y的反正切,x和y以弧度为单位cos(x)x的余弦,x以弧度为单位exp(x)x的指数函数int(x)x的整数部分,取靠近0一侧的值log(x)x的自然对数rand()比0大比1小的随机浮点值sin(x)x的正弦,x以弧度为单位sqrt(x)x的平方根srand(x)为计算随机数指定一个种子值除了标准函数外,gawk还支持一些按位操作数据的函数
and(v1, v2):v1和v2的按位与运算
compl(val):val的补运算
lshift(val, count):将值val左移count位
or(v1, v2):v1和v2的按位或运算
rshift(val, count):将值val右移count位
xor(v1, v2):执行值v1和v2的按位异或运算
gawk字符串函数
函数描述asort(s [, d])将数组s按数据元素值排序。索引值会被替换成表示新的排序顺序的连续数字。如果指定了d,则排序后的数组回存储在数组d中asorti(s [, d])将数组s按索引值排序。生成的数组会将索引值作为数据元素值,用连续数组索引来表明排序顺序。如果指定了d,排序后的数组回存储在数组d中gensub(r, s, h [, t])查找变量$0或目标字符串t(如果提供了的话)来匹配正则表达式r。如果h是一个以g或者G开头的字符串,就用s替换掉匹配的文本。如果h是一个数字,它表示要替换掉第几处r匹配的地方gsub(r, s, [, t])查找变量$0或目标字符串t(如果提供了的话)来匹配正则表达式r。如果找到了,就全部替换成字符串sindex(s, t)返回字符串t在字符串s中的索引值,如果没找到的话,返回0length([s])返回字符串s的长度,如果没有指定的话,返回$0的长度match(s, r [, a])返回字符串s中正则表达式r出现位置的索引。如果指定了数组a,它会存储s中匹配正则表达式的那部分split(s, a [, r])将s用FS字符或正则表达式r(如果指定了的话),分开放到数组a中。返回字段的总数sprintf(format, variables)用提供的format和variables返回一个类似于printf输出的字符串sub(r, s [, t])在变量$0或目标字符串t中查找正则表达式r的匹配。如果找到了,就用字符串s替换掉第一处匹配substr(s, i [, n])返回s中从索引值i开始的n个字符组成的子字符串。如果未提供n,则返回s剩下的部分tolower(s)将s的所有字符转换成小写 toupper(s)将s的所有字符转换成大写
gawk的时间函数
函数描述mktime(datespec)将一个YYYY MM DD HH MM SS [DST]格式置顶的日期转换彻骨时间戳(时间戳指:自1970-01-01 00:00:00 UTC到现在,以秒为单位的计数,通常称epoch time)strftime(format [, timestamp])将当前时间的时间戳huotimestamp(如果提供了的话)转化成用shell函数格式date()的格式化日期systime()返回当前时间的时间戳(同上面的时间戳)
自定义函数
定义函数
必须使用function关键字
使用自定义函数定义函数时,必须在所有代码块之前,包括BEGIN
使用函数库1.首先需要创建一个存储gawk函数的文件:
2.然后通过使用-f选项来指定函数库即可:转贴请保留以下链接本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/