awk

转载请注明来源:https://www.cnblogs.com/hookjc/

awk 的用法及注解

    awk -F: condition dist //这里的:是指以:为分隔,如果不用-F则默认为空格 
    首先对解释
    $0 //显示所有
    $1 //显示第一列
    $2 //显示第二列
    $3 //显示第三列
    $4 //显示第四列
    ......

    在我个人理解和sed结合太完美了,这是按列哦。。。
    [root@xiao_linux mybash]# cat >fawk.a
    1       xiao    25      beijing        9000
    2       liuwenjing      24      beijing        5000
    3       weijianjun      29      shanghai    8000
    4       wanmingyang     28      beijing        5000
    5       tianzhiyu       25      beijing        5500
    6       zhouhaoxing     23      beijing        5000
    ctrl+d
    //以上建立一个文件来做相应的操作。

    awk '{print $2,$4}' fawk.a //这里的意思是找到第二列及第四列的内容,并且显示出来。
    
    怎么样是不是很爽呢?
    awk 'BEGIN {print"name   address\n----------------"}{print $1,$4}' fawk.a
    这就更爽了 意指加上头部内容
    awk 'BIGIN {print"name   address\n------------"} {print $1,$4} END {print "content already end"}' fawk.a
    这加了尾内容

    如果要查找,可以用
    awk '{if($2~/wei/) print $0}' fawk.a     //这是精确查找
    awk '$0~/wei/' fawk.a //这条就OK了。

    awk '$2=="xiao" print $0' fawk.a     //只匹配xiao

    awk '$0!~/liu/' fawk.a         //除了liu的都显示

    awk '$0~/[Ll]iu/ {print $1,$2 " is my wife"}' fawk.a //查找出来的内容进行添加

    awk '{if($5>=5500) print $1,$2,$5}' fawk.a 

    awk '$0~/(xiao|liu)/' fawk.a

    awk '{if($2=="xiao" && $3=="beijing") print $0}' fawk.a
    
    awk '{if($2=="xiao" || $2~/liu/) print $0}' fawk.a

   awk的内置变量
    
    NR //打印出文件的记录个数

    awk '{print $0} END {print "总共次数:" NR}' fawk.a
    ll | awk '{print $0}END {print "总记录:"NR}'
    
    NF //显示每行记录中有多少条域,简单来理解就是有多少列
       //同时还有一个强大的功能,请看例子:

    pwd
    /home/myfile
    echo $PWD | awk -F/ '{print $NF}'  //将取出文件名myfile"/"为分隔符

   awk 操作符(>,==,>=.....不全介绍)

    ll | awk '{name=$9;tt=$7;if(tt>=13) print "文件名:name",$7,$9 }'
    //注意用心体会一下,上面的东东

    ll | awk 'BEGIN{NUMS=13}{if($7>=NUMS) print $7,$9}'

    //这一条命令也和上面同意思,可以看出可以在BEGIN中先定义一个变量,这是一个很不错的想法

    还有就是域可以进行数值运算(数值域)
    $7=$7-1 //意指值减1
    ll | awk '{$10=$7+1;print $0}'
    //注意上面的10域是新建的,本来是没有,意思是把7域中的数对应加1,然后赋到10域上,怎么样是不是很爽呢。

    如果要统计某列的总值
    
    ll | awk '{total+=$7;print $7};END{print "总计:"total}' //统计第七列的总和
    ll | awk '{if($7>=NUMS) print $7,$9}' NUMS=13 
    //这是给赋值,当然你可以在前面定义变量,后面引用时$NUMS
    //也就是说允许环境变量

    ll | awk 'total+=$5;END{print "总容量:" total}'

   awk 内置字符串函数

    gsub(r,s) //$0 中,s替换r
    gsub(r,s,n) //$n 中,s替换r
    length(s)  //s的长度
    index(s,t) //返回s中t的第一位置
    match(s,t) //在s中查找t匹配的,t可以用正则表达式 查找成功返回值,不成功返回"0"
    split(s,a,t) //t为分隔标准,s为字符,a为数组,a[1],a[2]....
    sub(t,s) //  t 为查找的,s为替换 查找第一次出行的
    substr($1,1,6) // $1是指域 这个和php是一样的,不讲 
    printf() //这个和c差不多,不讲


    ll | awk 'gsub(/xiao/,"hehe")'
    ll | sed 's/xiao/hehe'
    以上两个效果是一样的,但是第一条命令只是产生发生效果的东东。

    ll | awk '{print length($4)}'
    awk '{print lenght("hello,nice to see you!")}'
    
    ll | awk '{print match($4,/root/)}' | sed -n '2,$p'
    
    more fawk.a | awk '{printf("%15s\n",$2)}'
   
   awk 编写脚本
    ll | awk '{total+=$5}{print $0} END{print "总数:"total}'
    
    cat >it.awk
    #!/bin/awk -f
    (total+=$3)
    END{print "totals age:"total}
    
    chmod a+x it.awk
    ./it.awk myfile
    
    或者

    #!/bin/awk -f
    {total+=$3
    printf("%-16s %-10s\n",$2,$3)}
    END{print "ok:" total}
    
    对于数组可以这样处理
    BEGIN{
    recor="343@434@24324"
    split(recor,array,"@")}
    END{
    for(i in array) {print array[i]}
    }

来源:python脚本自动迁移

posted @ 2020-06-23 18:40  jiangcheng_15  阅读(214)  评论(0编辑  收藏  举报