美文网首页
2019-07-25 awk总结

2019-07-25 awk总结

作者: 麟之趾a | 来源:发表于2019-07-25 20:06 被阅读0次

    昨天回顾

    • sed命令
      -i修改放在所有参数的最后面常做修改前备份
      sed -i.bak '条件信息a添加的内容' 文件名

    今日总结

    • awk的执行原理


      awk执行原理.jpg
    • awk基本参数
      语法:awk [参数] ‘模式{动作}’ 文件
      三剑客命令awk作用
      处理文件信息:文本文件信息 日志文件信息 配置文件信息
      处理文件方式:排除信息,查询信息,统计信息替换信息
      对文件列进行处理
    awk参数
    -F 指定分隔符
    -v 指定变量
    动作
    print 指定输出信息
    gsub 指定替换
    gsub(‘要替换的内容’,’替换成什么’,$第几列)
    符号:
    ~:匹配信息,按指定列进行
    !~:将指定信息取反操作
    //:匹配指定的信息
    awk指定模式
    BEGIN{}处理文本之前执行动作
    END{}处理文本之后执行动作
    

    awk命令操作
    测试环境

    [root@oldboy63 ~]# cat regeix.txt 
    Zhang  Dandan    41117397    :250:100:175
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    

    01显示Xiaoyu的姓氏和ID号码

    [root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt (注意只显示第二个字段的Xiaoyu所以用$2匹配)
    Zhang 390320151
    
    1. 先查找模式(即条件)Xiaoyu
    [root@oldboy63 ~]# awk '$2~/Xiaoyu/' regeix.txt 
    Zhang  Xiaoyu    390320151   :155:90:201
    
    1. 根据条件进行处理显示姓氏和ID号码
    [root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt 
    Zhang 390320151
    

    02.找到姓氏为Zhang的人,显示他的捐款金额及他的名字

    [root@oldboy63 ~]# awk '$1~/Zhang/{print $1,$2,$4}' regeix.txt 
    Zhang Dandan :250:100:175
    Zhang Xiaoyu :155:90:201
    

    03.显示所有以41开头的ID号码的人及全人民

    [root@oldboy63 ~]# awk '$3~/^41/{print $1,$2}' regeix.txt 
    Zhang Dandan
    Liu Bingbing
    

    04.显示所有ID号码最后一位是5或1的人的全名

    [root@oldboy63 ~]# awk '$3~/1$|5$/{print $1,$2}' regeix.txt 
    Zhang Xiaoyu
    Wu Waiwai
    Wang Xiaoai
    Li Youjiu
    Lao Nanhai
    

    05.获取文件中没有#号和空行的信息
    环境

    [root@oldboy63 ~]# cat test.txt 
    hang  Dandan    41117397    :250:100:175
    #Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    #Wang   Xiaoai    3515064655  :50:95:135
    
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    
    Lao    Nanhai    918391635   :250:100:175
    Lao    Nanhai    Xiaoyu   :250:100:175
    

    方法一:直接使用!取反

    [root@oldboy63 ~]# awk '!/#|^$/' test.txt 
    hang  Dandan    41117397    :250:100:175
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    Lao    Nanhai    Xiaoyu   :250:100:175
    

    方法二:直接使用$1!~取反

    [root@oldboy63 ~]# awk '$1!~/#|^$/' test.txt 
    hang  Dandan    41117397    :250:100:175
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    Lao    Nanhai    Xiaoyu   :250:100:175
    

    06.显示Xiaoyu的捐款,每个捐款数都必须用$显示

    方法一:awk+sed
    [root@oldboy63 ~]# awk  '/Xiaoyu/{print $NF}' regeix.txt |sed 's#:#$#g'
    $155$90$201
    方法二:awk
    [root@oldboy63 ~]# awk  -F ":" '/Xiaoyu/{print "$"$2"$"$3"$"$4}' regeix.txt 
    $155$90$201
    方法三:awk+gsub参数
    [root@oldboy63 ~]# awk '/Xiaoyu/{gsub(/:/,"$",$NF);print($NF)}' regeix.txt 
    $155$90$201
    
    07.普通模式比较行信息
    

    01 查找第二行以上的信息

    [root@oldboy63 ~]# awk 'NR>2' regeix.txt 
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    

    02;取出多行信息

    1. 取出第二行和第四行信息
    [root@oldboy63 ~]# awk 'NR==2;NR==4' regeix.txt 
    Zhang  Xiaoyu    390320151   :155:90:201
    Wu     Waiwai    70271111    :250:80:75
    
    1. 取出第二行到第四行信息
    [root@oldboy63 ~]# awk 'NR==2,NR==4' regeix.txt 
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    

    7.5.2.2 特殊模式BEGIN和END模式
    BEGIN处理文件之前,先做什么事情

    [root@oldboy63 ~]# awk 'BEGIN{print "姓氏" " " "名字"" " "ID号码" " " "捐款钱数"}{print $0}' regeix.txt |column -t
    姓氏   名字      ID号码      捐款钱数
    Zhang  Dandan    41117397    :250:100:175
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    

    BEGIN用于计算

    [root@oldboy63 ~]# awk 'BEGIN{print 2%3}'
    2
    [root@oldboy63 ~]# awk 'BEGIN{print 2-3}'
    -1
    

    BEGIN用于修改内置变量

    [root@oldboy63 ~]# awk 'BEGIN{FS="[ :]+"}/Xiaoyu/{print $4,$5,$6}' regeix.txt 
    155 90 201
    [root@oldboy63 ~]# awk -vFS="[ :]+" '/Xiaoyu/{print $4,$5,$6}' regeix.txt
    155 90 201
    [root@oldboy63 ~]# awk -voldboy="4" '/Xiaoyu/{print oldboy}' regeix.txt
    4
    

    END在处理之后,在做什么事情

    [root@oldboy63 ~]# awk '{print $0}END{print "学生捐款表"}' regeix.txt 
    Zhang  Dandan    41117397    :250:100:175
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    学生捐款表
    

    对行数进行统计

    [root@oldboy63 ~]# awk '{i++}END{print i}' regeix.txt 
    9
    

    对数值求值运算

    [root@oldboy63 ~]# seq 10|awk '{sum=sum+$1}END{print sum}'
    55
    

    相关文章

      网友评论

          本文标题:2019-07-25 awk总结

          本文链接:https://www.haomeiwen.com/subject/klukrctx.html