【awk】awk语法(小结)Shell编程 2010-05-25 11:04:45 阅读644 评论0 字号:大中小 导读:bkeep 第一篇:基础篇 1,awk基本语法 2,比较操作符 3,复合表达式 4,next命令: 5,awk中的数字操作符: 6,awk中的赋值操作符 7,BEGIN 和 END 8,内置变量 9,awk使用shell变量 10,awk中的三种流控制语句 10.1 if语句 10.2 while语句: 10.3 for语句: 11. $0: 12,shell里的特殊变量 第二篇:准高级篇 1,内置函数 2, 输入输出的内部函数 3,借用C语言的格式化输出指令, 4,printf “%。。。”中的。。。有以下格式 5,gawk中的特殊字符: 6, 改变字段分隔符 7, 元字符 8, 调用gawk程序 9, 数组 10, 用户自定义函数 正文: 第一篇:基础篇1,awk基本语法awk ‘script’ files script 由下面的结构组成 /pattern/{actions} 2,比较操作符语法:expression {actions;} expression 可以使用以下操作符构成 < 小于 > 大于 <= 小于等于 >= 大于等于 == 等于 != 不等于 value ~ /pattern/ 若value匹配pattern则为真 value !~ /pattern/ 若value不匹配pattern则为真 说明:$2 ~ /^\$[1-9][0-9]* 将匹配第二列以$开头,然后大于1的二位数。(注意,这里是1而不是10) 3,复合表达式语法:(compound expression) (expr1)&& (expr2) ------- 与 (expr1)|| (expr2) ------- 或 说明一下:符合表达式必须用括号括起来 当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真; 当使用 || 时,expr1和expr2 只要有一个为真,复合表达式则为真! 4,next命令:告诉awk跳过剩下的所有模式和表达式,并读取输入的下一行,同时从第一个模式或表达式开始处理该行! 5,awk中的数字操作符:+ 加 - 减 * 乘 / 除 % 求余 ^ 求幂 6,awk中的赋值操作符+= x+=1 就是x=x+1 -= x-=1 就是x=x-1 *= x*=1 就是x=x*1 /= x/=1 就是x=x/1 %= x%=2 就是x=x%2 ^= x^=2 就是x=x^2 7,BEGIN 和 ENDawk的语法:/pattern/ {action} pattern:模式 这里pattern有两个特殊模式BEGIN和END 下面是BEGIN END的语法: awk ‘ BEGIN { actions } / pattern / { actions } / pattern / { actions } END { actions } ‘ files BEGIN和END都是可选的 ·当指定BEGIN模式时,awk在读取任何输入前执行动作 actions ·当指定END模式时,awk在其退出前执行动作actions 这里要特别注意:比如awk读入aa.txt。那么BEGIN只在读入aa时执行一次,然后按行处理的时候不再执行BEGIN指定的action!(也可以这么理解:BEGIN只对文件生效,而不是按行生效!!);理解了BEGIN,END还会糊涂吗?呵呵! 8,内置变量gawk语言中有几个十分有用的内置变量,现在列于下面: NR 已经读取过的记录数。 FNR 从当前文件中读出的记录数。 FILENAME 输入文件的名字。 FS 字段分隔符(缺省为空格)。 RS 记录分隔符(缺省为换行)。 OFMT 数字的输出格式(缺省为% g)。 OFS 输出字段分隔符。 ORS 输出记录分隔符。 NF 当前记录中的字段数。 如果你只处理一个文件,则NR 和FNR 的值是一样的。但如果是多个文件, NR是对所有的文件来说的,而FNR 则只是针对当前文件而言。 改变内置变量的方法?# awk 'BEGIN {FS=":"} {print $1 |"sort"}' /etc/passwd adm apache avahi 此程序会将所有用户的登录名称,依照字母的顺序显示出来。 9,awk使用shell变量经过前面的学习,我们知道shell变量的引用由$xxx 实现,而awk中的变量直接使用xxx来引用。所以我们就要思考如何让awk使用shell变量 语法: awk ‘script’ awkvar1=value awkvar2=value ...... files 说明: awk: 命令; ‘script’:awk将要执行的脚本; awkvarN:awk的变量;value:shell中的变量值; files:将要处理的文件名 10,awk中的三种流控制语句if语句 while语句 for语句 10.1 if语句if (expression1) {action1} else if (expression2) {action2} else { action3} 执行过程: 1)计算expression1的值 2)若expression1为真,执行action1并推出if语句 3)若expression1为假,计算expression2 4)若expression2为真,执行action2并退出if语句 5)若expression2为假,执行action3并退出if 10.2 while语句:while (expression) { actions } 若expression为真,则执行actions [root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {x+=1;print x;}}' //先给x+1再输出 10.3 for语句:for (initialize_counter; test_counter;increment_counter) { action } 解释一下,呵呵 for (初始化计数器变量;测试计数器是否到顶了;增加计数器的值) { 要执行的动作! } 【常用】 循环迭代处理记录中的域并输出他们 [root@master bkeep]# cat for2.sh #!/bin/bash awk '{ for (x=1;x<=NF;x+=1) { printf "%s ",$x "zbb"; } printf "\n"; }' fruit_prices.txt 11. $0:awk使用变量0原原本本地存储它所读入的整个输入行。这样可以保持和原来文本格式相同的输出 12,shell里的特殊变量# sh /usr/local/bkeep/shell.sh 001 002 I'm $0 is:/usr/local/bkeep/shell.sh //正在被执行脚本的名字;`basename $0` I'm $1 is:001 //$1接收到的参数 I'm $2 is:002 //$2接收到的参数 I'm $# is:2 //总共接收到的参数个数 I'm $* is:001 002 //把接收到的参数全部打印出来 I'm $@ is:001 002 //同上 I'm $? is:0 //上一个脚本的退出状态“ I'm $$ is:24137 //当前执行脚本的进程ID I'm $! is: //前一个后台进程的id 第二篇:准高级篇1,内置函数 length(string) 求出string 有几个字符。 match ( string,regexp ) 在字符串string 中寻找符合regexp 的最长、最靠左边的子字 符串。返回值是regexp 在string 的开始位置,即index值。match 函数将会设置系统变量 RSTART 等于index的值,系统变量RLENGTH 等于符合的字符个数。如果不符合,则会 设置R S TA RT 为0、RLENGTH 为- 1。 sprintf ( format,expression1,. . . ) 和printf 类似,但是sprintf 并不显示,而是返回字 sub ( regexp,replacement,target ) 在字符串target 中寻找符合regexp 的最长、最靠左的地方,以字串replacement 代替最左边的regexp。 ·gsub(regexp,replacement,target)与前面的sub类似。在字符串target中寻找符合regexp的所有地方,以字符串replacement代替所有的regexp。例如: substr(string,start,length)返回字符串string的子字符串,这个子字符串的长度为 length,从第start个位置开始。 tolower(string) 将字符串string的大写字母改为小写字母。 toupper(string) 将字符串s t r i n g的小写字母改为大写字母。 2, 输入输出的内部函数 close(filename) 将输入或输出的文件filename 关闭。 system(command) 此函数允许用户执行操作系统的指令,执行完毕后将回到gawk程 3,借用C语言的格式化输出指令,可以让gawk的输出形式更为多样。这时,应该用printf而不是print。例如: # gawk '$1 != "Tim" {printf "%5s likes this language\n",$2}' testfile 10 likes this language 90 likes this language 110 likes this language %5是定义$2列的输出占5个字符的位置 \n 是换行符 printf是C语言的格式化输出 4,printf “%。。。”中的。。。有以下格式 d 显示十进制的整数。 i 显示十进制的整数。 e 将浮点数以科学记数法的形式显示。 f 将数字以浮点的形式显示。 g 将数字以科学记数法的形式或浮点的形式显示。数字的绝对值如果大于等于0.0001则 o 显示无符号的八进制整数。 s 显示一个字符串。 x 显示无符号的十六进制整数。1 0至1 5以a至f表示。 X 显示无符号的十六进制整数。1 0至1 5以A至F表示。 % 它并不是真正的格式控制字符,% %将显示%。 5,gawk中的特殊字符:你也可以使用一些换码控制符格式化整行的输出。之所以叫做换码控制符,是因为gawk对这些符号有特殊的解释。下面列出常用的换码控制符: a 警告或响铃字符 b 后退一格 f 换页 n 换行 r 回车 t Ta b v 垂直的t a b 验证一下\a,运行后“当”了一声,呵呵,有意思! # gawk '{printf "%5s works for %10s and earns % 6, 改变字段分隔符# awk -F "," '{print $1,$2,$3}' aa 7, 元字符 ^ 表示字段的开始。 $ 表示字段的结束。 . 表示和任何单字符m匹配。 | 表示“或”。 * 表示字符的零到多次重复。 + 表示字符的一次到多次重复。 {a,b} 表示字符a次到b次之间的重复。 //没有成功! 表示字符零次和一次的重复。 [] 表示字符的范围。 [^] 表示不在[ ]中的字符。 8, 调用gawk程序# gawk –f script filename # gawk –f script -F";" filename # gawk -f script filename1 filename2 filename3 ... 9, 数组gawk语言支持数组结构。数组不必事先初始化。声明一个数组的方法如下: arrayname[num]=value请看下面的例子: # cat reverse.sh #!/bin/bash {line[NR] = $0 } # remember each line END {var=NR # output lines in reverse order while (var > 0){ print line[var] var-- } } 10, 用户自定义函数下面详细解释一下自定义的function函数 # cat function.sh #!/bin/bash {print "sum=",SquareSum($1,$2)} //这行是awk最终执行的动作(调用我们自定义的函数) //这里把栏位1和栏位2的值分别赋予x,y变量 function SquareSum(x,y){ //function是关键字,SquareSum是自定义函数名, //x,y是自定义函数的参数列表 sum=x*y+y*y //函数真正的功能:先相乘再相加,最后返回sum值! return sum } # cat testfile 1 10 11 12 1.1111 9 90 91 92 9.99999 11 110 111 112 111.1111 Tim zhengbin bkeep tom # cat function.sh #!/bin/bash {print "sum=",SquareSum($1,$2)} function SquareSum(x,y){ sum=x*y+y*y return sum } # awk -f function.sh testfile sum= 110 sum= 8910 sum= 13310 sum= 0 |
|
来自: kokogood > 《linux以及应用方面》