Linux文本处理工具之awk(2)

例如
        1.内置变量
            a.$0
                awk '/^root/{print $0}' /etc/passwd  #/^root/为选择表达式,$0代表是逐行
            b.设置字段分隔符号(FS)
                awk 'BEGIN {FS=":"} /^root/ {print $1, NF}' /etc/passwd #FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。NF是字段总数,$0代表当前行记录,$1-$n是当前行,各个字段对应值。
            c.记录条数(NR、FNR)
                awk 'BEGIN {FS=":"} {print NR, $1, FNR}' /etc/passwd #NR得到当前记录所在行
            d.设置输出字段分隔符(OFS)
                awk 'BEGIN {FS=":"; OFS="~~"} /^root/ {print FNR, $1, $NF}' /etc/passwd #OFS设置默认字段分隔符
            e.设置输出行记录分隔符(ORS)
                awk 'BEGIN {FS=":"; ORS="~~"} {print FNR, $1, $NF}' #ORS默认是换行符,这里修改为:”~~”,所有行之间用”~~”分隔了
            f.输入参数获取(ARGC,ARGV)
                awk 'BEGIN {FS=":"; print "ARGC="ARGC; for (k in ARGV) {print k"="ARGV[k];}}' /etc/passwd #ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组
            g.获得传入的文件名(FILENAME)
                awk 'BEGIN {FS=":"; print FILENAME} {print FILENAME}' /etc/passwd #FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量。
            h.获得linux环境变量(ENVIRON)
                awk 'BEGIN {print ENVIRON["PATH"];}' /etc/passwd #ENVIRON是子典型数组,可以通过对应键值获得它的值。
            i.输出数据格式设置(OFMT)
                awk 'BEGIN {OFMT="%.3f"; print 2/3,123.11111111;}' /etc/passwd #OFMT默认输出格式是:%.6g 保留六位小数,这里修改OFMT会修改默认数据输出格式
            j.按宽度指定分隔符
                echo 20100117054932 | awk 'BEGIN {FIELDWIDTHS="4 2 2 2 2 3"} {print $1"-"$2"-"$3,$4":"$5":"$6}' #FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS="4 2 2 2 2 2"就表示$1宽度是4,$2是2,$3是2  .... 。这个时候会忽略:FS分隔符
            k.RSTART RLENGTH
                awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
                awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }' #RSTART被匹配正则表达式首位置,RLENGTH匹配字符长度,没有找到为-1.
        2.获取外部变量
            a.获取普通的外部变量
                test='awk code'
                echo | awk '{print test}' test="$test"
                echo | wawk 'BEGIN {print test}' test="$test" #传入的变量可以在action中获取值,但是变量名与值放到'{action}'后边。其中BEGIN的action是不能获得
            b.BEGIN程序块的变量
                test='awk code'
                echo | awk -v test="$test" 'BEGIN {print test}'
                echo | awk -v test="$test" '{print test}' #用-v 传入变量可以在3中类型的action 中都可以获得到,但顺序在  action前面
            c.获得环境变量
                awk  'BEGIN {for (i in ENVIRON) {print i"="ENVIRON[i];}}'
        3.运算符
            a.赋值运算符、算术运算
                echo | awk 'BEGIN {a=1; b=5; c=3} {a+=5; b++; c--} END {print a, b, c, a*b}'
            b.逻辑运算符
                awk 'BEGIN {a=1; b=2; print (a>5 && b<=2),(a>5 || b<=2);}'
            c.关系运算符
                awk 'BEGIN{a="11";if(a >= 9){print "ok";}}' #> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串 就会转换为字符串比较。两个都为数字 才转为数值比较。字符串比较:按照ascii码顺序比较
            d.其它运算符
                awk 'BEGIN {a="b"; print a=="b" ? "ok" : "err";}'  #三目运算
                awk 'BEGIN {a="b"; arr[0]="b"; arr[1]="c"; print (a in arr);}' #判断数组中是否存在该键值
        3.字符操作
            a.字符串转数字
                awk 'BEGIN {a="100"; b="10test10"; print (a+b+0);}'
                awk 'BEGIN {a="100"; b="10test10"; print a+b+0;}'
            b.数字转字符串
                awk 'BEGIN {a=100; b=100; c=(a""b); print c}'
                awk 'BEGIN {a=100; b=100; c=a""b; print c}'
            c.字符串连接
                awk 'BEGIN {a="a"; b="b"; c=a""b; print c}'
        3.数组操作
            a.赋值
                awk 'BEGIN {tB["a"]="a1"; tB["b"]=1;}'
            b.数组长度(length)
                awk 'BEGIN {tB["a"]="a1"; tB["b"]=1; print length(tB)}'
                awk 'BEGIN {info="it is a test"; split(info,tA," "); print asort(tA);}'  #asort对数组进行排序,返回数组长度
            c.字符串分割为数组(split)
                awk 'BEGIN {info="it is a test"; lens=split(info,tA," "); print length(tA), lens;}' #length返回字符���以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度
            d.数组输出
                awk 'BEGIN {info="it is a test"; split(info,tA," "); for(k in tA){print k, tA[k];}}' #for…in 输出,因为数组是关联数组,默认是无序的。
                awk 'BEGIN {info="it is a test"; tlen=split(info,tA," "); for(k=1; k<=tlen; k++){print k, tA[k];}}' #如果需要得到有序数组,需要通过下标获得。数组下标是从1开始,与c数组不一样
            e.判断键值是否存在
                awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if(tB["c"]!="1"){print "no found";}; for(k in tB){print k,tB[k];}}' #tB[“c”]没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列
                awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if( "c" in tB){print "ok";}; for(k in tB){print k,tB[k];}}' #if(key in array) 通过这种方法判断数组中是否包含”key”键值,才能正确的判断
            f.删除键值
                awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; delete tB["a"]; for(k in tB){print k, tB[k];}}'
            g.二维数组
                awk 'BEGIN{
                    for(i=1;i<=9;i++)
                    {
                      for(j=1;j<=9;j++)
                      {
                    tarr[i,j]=i*j;
                    print i,"*",j,"=",tarr[i,j];
                      }
                    }
                    }'
                #array[k,k2]引用获得数组内容
        4.流程控制操作
            a.awk 'BEGIN{
                    score=100;
                    if(score>90)
                    {
                        print "优秀";
                    }
                    else if(score>80)
                    {
                        print "良好";
                    }
                    else if(score>70)
                    {
                        print "普通";
                    }
                    else if(score>60)
                    {
                        print "及格";
                    }else
                    {
                        print "不及格";
                    }
                    }'
            b.awk 'BEGIN{
                    total=0;
                    while(i<=100)
                    {
                        total+=i;
                        i++;
                    }
                    print total;
                    }'
            c.awk 'BEGIN{
                    for(k in ENVIRON)
                    {
                        print k"="ENVIRON[k];
                    }
                    }'  #ENVIRON是awk常量,是数组
            d.awk 'BEGIN{
                    total=0;
                    for(i=0;i<=100;i++)
                    {
                        total+=i;
                    }
                    print total;
                    }'
            e.awk 'BEGIN{
                    total=0;
                    i=0;
                    do
                    {
                        total+=i;
                        i++;
                    }while(i<=100)
                    print total;
                    }'
        5.内置函数
            a.算术函数
                awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' #OFMT 设置输出数据格式是保留3位小数
                awk 'BEGIN{srand();fr=int(100*rand());print fr;}' #获得随机数
            b.字符串函数
                awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' #在 info中查找满足正则表达式,/[0-9]+/ 用””替换,并且替换后的值,赋值给info 未给info值,默认是$0
                awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
                awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'  #正则匹配
                awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' #从第 4个 字符开始,截取10个长度字符串
                awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' #分割info,动态创建数组tA
            c.时间函数
                awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
                awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' #求2个时间段中间时间差
            d.其他函数
                awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' #打开外部文件
                awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' #逐行读取外部文件
                awk 'BEGIN{print "Enter your name:";getline name;print name;}'
                awk 'BEGIN{b=system("ls -al");print b;}' #调用外部应用程序
        6.输出函数
            a.printf
                awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}' #类似于C语音
        7.awk脚本
            #!/bin/awk -f
            BEGIN{
                for(i=1;i<=9;i++)
                    {
                        for(j=1;j<=9;j++)
                        {
                            tarr[i,j]=i*j;
                            print i,"*",j,"=",tarr[i,j];
                        }
                    }
            }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/17024.html