我的新浪微博:http://weibo.com/u/1602714773
CSDN博客:http://blog.csdn.net/hunterno4
Linux Shell笔记之gawk
上一篇 /
下一篇 2013-12-22 17:09:36
/ 个人分类:Linux
gawk:Unix中原始awk程序的GNU版本,强大之处在于可以写脚本来读取文本行的数据,然后处理并显示数据。命令格式:gawk options program file一、gawk基础
1.命令行读取程序脚本# gawk '{print "hello world"}' //gawk假定脚本是单个文本字符串,须将脚本放到单引号中hellohello worldhihello world2.数据字段变量文本行中发现的数据元素使用$0、$1等来分配变量$0代表整个文本行$1代表文本行中的第1个数据字段,$2等依次类推默认分隔符为空白字符# gawk '{print $1}' data1this# gawk -F: '{print $1}' passwd //使用-F来指定字段分隔符rootbindaemonadm3.使用多个命令# echo "this is a test" | gawk '{$4="gawk";print $0}' //使用;号隔开this is a gawk4.从文件中读取程序# cat gawktest {text="'s home directory is "print $1 text $6 //gawk程序中使用变量无需加美元符}# gawk -F: -f gawktest passwd root's home directory is /rootbin's home directory is /bindaemon's home directory is /sbinadm's home directory is /var/adm5.BEGIN与END# cat beginend BEGIN { //BEGIN处理数据前运行的脚本print "userid shell"print "------ -----"FS=":" //FS脚本中定义分隔符}{print $1 " " $7 //引号内为制表符,这样输出的结果才能对齐}END { //END处理数据后运行的脚本print "end of list"}# gawk -f beginend passwd userid shell------ -----root /bin/bashbin /sbin/nologindaemon /sbin/nologinadm /sbin/nologi...end of list二、gawk进阶
1.使用变量
1)内建变量FIELDWIDTHS 由空格分隔开的定义了每个数据字段确切宽度的一列数字FS 输入字段分隔符RS 输入数据行分隔符OFS 输出字段分隔符ORS 输出数据行分隔符# cat data1data1.data2.data3data4.data5.data6# gawk 'BEGIN{FS=".";OFS="-"} {print $1,$2,$3}' data1data1-data2-data3data4-data5-data6# cat datanumber 1234.567.827 //使用了FIELDWIDTHS变量,gawk会忽略FS变量,一旦设置不能改变# gawk 'BEGIN{FIELDWIDTHS="1 2 3 4"} {print $1,$2,$3,$4}' datanumber 1 23 4.5 67.82.数据变量ARGC 当前命令行参数个数ARGV 包含命令行参数的数组ENVIRON 当前shell环境变量及其值组成的关联数组FNR 当前数据文件中的数据行数NF 数据文件中的字段总数NR 已处理的输入数据行数目# gawk 'BEGIN{print ARGC,ARGV[0]}' data1 //引用gawk变量,不用加$符号2 gawk]# gawk '> BEGIN{> print ENVIRON["HOME"] //提取HOME变量> print ENVIRON["PATH"]> }'/root/usr/local/program/jdk1.6.0_33/bin# gawk 'BEGIN{FS=":";OFS="-"} {print $1,$NF}' passwd //NF指定数据行中的最后一个数据字段root-/bin/bashbin-/sbin/nologindaemon-/sbin/nologin3.自定义变量# cat script1 #!/bin/bashBEGIN{print "the n value is",n;FS="."}{print $n}# gawk -f script1 n=3 data1the n value is data3data6# gawk -v n=3 -f script1 data1 //BEGIN代码之前设定的变量需要用-v参数指定the n value is 3data3data64.处理数组1)定义数组 //与哈希表类似格式: var[index]= element # gawk 'BEGIN{> capital["shanghai"]="shanghai"> print capital["shanghai"]> }'shanghai 2)遍历数组# gawk 'BEGIN{> var["g"]=1> var["a"]=2> var["w"]=3> var["k"]=4> for(test in var)> {> print "index:",test," - value:",var[test] //中间有逗号> }> }'index: w - value: 3 //输出值只能保证一一对应,不能按顺序index: k - value: 4index: a - value: 2index: g - value: 13)删除数组# cat script2#!/bin/bashBEGIN{var["g"]=1var["a"]=2var["w"]=3var["k"]=4for(test in var){ print "index:",test," - value:",var[test]}delete var["a"] //删除指定数组中的数据元素print "---"for(test in var){ print "index:",test," - value:",var[test]}}# gawk -f script2index: w - value: 3index: k - value: 4index: a - value: 2index: g - value: 1---index: w - value: 3index: k - value: 4index: g - value: 15.使用模式1)正则表达式# gawk 'BEGIN{FS="."} /1/{print $1}' data1 //匹配data1文件中含有1的data12)匹配操作符波浪线~,匹配操作符可以将正则表达式限定在数据行中的特一数据字段# gawk -F: '$1 ~ /root/{print $1,$NF}' passwd //查找第一个数据字段中匹配root的数据root /bin/bash# gawk -F: '$1 !~ /root/{print $1,$NF}' passwd //波浪线前加!号,排除匹配到的数据bin /sbin/nologindaemon /sbin/nologinadm /sbin/nologinlp /sbin/nologinsync /bin/syncshutdown /sbin/shutdown3)数学表达式可以使用普通数学表达式,x == y; x<=y;x>y 等等# gawk -F: '$4 == 0{print $1}' passwd //查找第四个数据字段为0,即属于root用户组的用户rootsyncshutdownhaltoperator6.结构化命令1)if语句# cat script3#!/bin/bash{if ($1 <5){ x = $1 + 20 print x} else{ x = $1 + 30 print x}}# gawk -f script3 dataif 21222324353637382)while语句# cat datawhile 12 13 1445 56 7822 33 44# cat script4#!/bin/bash{total=0i=1while (i<4){ total += $i i++}avg = total / 3print "avg:",avg}# gawk -f script4 datawhile avg: 13avg: 59.6667avg: 333)for语句# cat script5#!/bin/bash#!/bin/bash{total=0i=1for (i=1;i<4;i++){ total += $i}avg = total / 3print "avg:",avg}7.格式化输出printf格式化输出c 将一个数作为ASCII字符显示d 显示一个整数值e 科学计数法显示f 显示浮点数o 显示一个八进制值s 显示一个文本字符串x 显示一个十六进制值X 显示一个十六进制值,但用大写字母A-F# cat script5#!/bin/bash#!/bin/bash{total=0i=1for (i=1;i<4;i++){ total += $i}avg = total / 3printf "avg: %5.1f\n",avg //近似到小数点1位}8.内建函数gawk提供了一些内置函数1)数学函数exp(x) x的指数函数int(x) x的整数部分rand() 0至1之间的随机浮点数x=int(10 * rand())2) 字符串函数asort(s [,d]) 将数组s按数据元素值排序index(s,t) 返回字符串t在字符串s中的索引值length([s]) 返回字符串s的长度3)时间函数mktime(datespec) 将一个按YYYY MM DD HH MM SS格式的日期转换成时间戳systime() 返回当前时间的时间戳strftime(format [,timestamp]) 将时间戳转成date()格式化日期# gawk 'BEGIN{> date = systime()> day = strftime("%A,%B %d,%Y",date)> print day> }'Sunday,December 22,2013
收藏
举报
TAG:
gawk
Linux
shell
Shell
变量
函数