美文网首页
D19-操作系统awk命令

D19-操作系统awk命令

作者: 荆俊玮 | 来源:发表于2019-07-28 22:09 被阅读0次

    一、三剑客命令awk概述

    gawk :

    pattern scanning and processing language==>可以进行模式扫描 和 是一门语言
    语法 : awk [参数] '模式{动作}' 文件

    二、 三剑客命令awk作用

    1.处理文件信息: 文本文件信息 日志文件信息 配置文件信息
    2.处理文件方式: 排除信息 查询信息 统计信息 替换信息
    对文件列进行处理

    三、 三剑客命令awk操作

    创建测试环境
    cat reg.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

    1.显示xiaoyu的姓氏和ID号码

       awk '{print $1 $3}'  文件信息
        第一个步骤: 找出需要编写模式信息
        获取xiaoyu信息
        awk '/Xiaoyu/'  reg.txt
        awk '$2~/Xiaoyu/' reg.txt
        第二个步骤: 根据条件做处理
        显示满足条件的第三列和第一列信息
        awk '$2~/Xiaoyu/{动作}' reg.txt
        awk '$2~/Xiaoyu/{print $1 $3}' reg.txt
        答案:
        [root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
        Zhang 390320151
        [root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $1" "$3}' reg.txt
        Zhang 390320151
    

    2.姓氏是Zhang的人,显示他的第二次捐款金额及他的名字

        第一个步骤: 找出需要编写模式信息 
        awk '$1~/Zhang/' reg.txt
        第二个步骤: 根据条件做处理 
        awk '$1~/Zhang/{print $1,$2,$4}' reg.txt
        awk -F ":"  '$1~/Zhang/{print $3}' reg.txt
        答案:
        [root@oldboyedu ~]# awk -F "[: ]+"  '$1~/Zhang/{print $1,$2,$5}' reg.txt
        Zhang Dandan 100
        Zhang Xiaoyu 90
    

    3.显示所有以41开头的ID号码的人的全名和ID号码

        第一个步骤: 找出需要编写模式信息 
        awk '$3~/^41/' reg.txt
        第二个步骤: 根据条件做处理
        答案:
        awk '$3~/^41/{print $1,$2,$3}' reg.txt
        [root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
        Zhang Dandan 41117397
        Liu Bingbing 41117483
        [root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' reg.txt|column -t
        Zhang  Dandan    41117397
        Liu    Bingbing  41117483
    

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

        第一个步骤: 找出需要编写模式信息
        awk '$3~/1$|5$/' reg.txt
        awk '$3~/[15]$/' reg.txt
        awk '$3~/(1|5)$/' reg.txt
        第二个步骤: 根据条件做处理
        答案
        [root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' reg.txt|column -t
        Zhang  Xiaoyu
        Wu     Waiwai
        Wang   Xiaoai
        Li     Youjiu
        Lao    Nanhai
        [root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2,$3}' reg.txt|column -t
        Zhang  Xiaoyu  390320151
        Wu     Waiwai  70271111
        Wang   Xiaoai  3515064655
        Li     Youjiu  918391635
        Lao    Nanhai  918391635
    

    05. 获取文件中有井号或空行的内容, 将空行和井号信息的行排除

        第一个步骤: 找出需要编写模式信息
        awk '/#|^$/'  reg.txt       
        awk '$0~/#|^$/'  reg.txt    
        说明: $0 表示将文件所有列信息进行显示
        awk '$0!~/#|^$/'  reg.txt
        awk '!/#|^$/'  reg.txt
        第二个步骤: 根据条件做处理
        答案:
        [root@oldboyedu ~]# awk '$0!~/#|^$/'  reg.txt
        Zhang  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
        [root@oldboyedu ~]# awk '$0!~/#|^$/{print $0}'  reg.txt
        Zhang  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的捐款,每个捐款数额都是以$开头, 如$110$220$330     
        awk '$2~/Xiaoyu/{print $4}' reg.txt|sed 's#:#$#g'   
        awk '$2~/Xiaoyu/{print $4}' reg.txt|tr ':' '$'
        awk -F "[: ]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt
        
        awk替换
        gsub  = gawk substitute
        gsub(/要替换的信息/,"替换成什么".$将第几列)
        [root@oldboyedu ~]# awk  '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
        $155$90$201
        说明: $NF 表示文件的最后一列信息 
    

    6。awk命令模式分类

    ###a.普通模式: 比较行信息
    [root@oldboyedu ~]# cat reg.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@oldboyedu ~]# awk  'NR>2' reg.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
    [root@oldboyedu ~]# awk  'NR<2' reg.txt
    Zhang  Dandan    41117397    :250:100:175   
    

    说明: NR 表示文件行信息

    b.###取出多行信息
    [root@oldboyedu ~]# awk 'NR==2,NR==4' reg.txt --- 连续多行
    Zhang Xiaoyu 390320151 :155:90:201
    Meng Feixue 80042789 :250:60:50
    Wu Waiwai 70271111 :250:80:75
    [root@oldboyedu ~]# awk 'NR==2;NR==4' reg.txt --- 不连续多行
    Zhang Xiaoyu 390320151 :155:90:201
    Wu Waiwai 70271111 :250:80:75

    c.特殊模式:

    BEGIN{动作}:  在处理文件之前,先做什么事情
    [root@oldboyedu ~]# awk  'BEGIN{print "姓","名","号码","捐款记录"}{print $0}' reg.txt|column -t
    姓     名        号码        捐款记录
    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
    

    d.用于计算:

    [root@oldboyedu ~]# awk "BEGIN{print 2+2}"
    4
    [root@oldboyedu ~]# awk "BEGIN{print 2-2}"
    0
    [root@oldboyedu ~]# awk "BEGIN{print 2*2}"
    4
    [root@oldboyedu ~]# awk "BEGIN{print 3/2}"
    1.5
    [root@oldboyedu ~]# awk "BEGIN{print 3^2}"
    9
    [root@oldboyedu ~]# awk "BEGIN{print 3^3}"
    27
    [root@oldboyedu ~]# awk "BEGIN{print 3**3}"
    27
    [root@oldboyedu ~]# awk "BEGIN{print 5%3}"
    2
    

    e.修改内置变量:

    NF:  取出最后一列
         # awk '{print $(NF-1)}' reg.txt   --- 取出倒数第二列
    NR:  表示行信息
    FS:  指定列分隔符, 默认识别空格为分割符
         [root@oldboyedu ~]# awk 'BEGIN{FS="[: ]+"}{print $4}' reg.txt
         250
         155
         250
         250
         250
         50
         250
         175
         250
         [root@oldboyedu ~]# awk -vFS="[: ]+"  '{print $1,$4}' reg.txt
         Zhang 250
         Zhang 155
         Meng 250
         Wu 250
         Liu 250
         Wang 50
         Zi 250
         Li 175
         Lao 250
    
    END{动作}:    在处理文件之后,再做什么事情
    [root@oldboyedu ~]# awk  'BEGIN{print "姓","名","号码","捐款记录"}{print $0}END{print "学生捐款登记表"}' reg.txt|column -t
    姓              名        号码        捐款记录
    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
    学生捐款登记表
    
    实际作用:
    可以将统计后的最终结果进行输出
    

    7. awk对文件进行统计分析

    awk统计运算公式
    a 文本信息累加运算
    i=i+1
    统计文件行数
    awk '{i=i+1}END{print i}' test.txt
    [root@oldboyedu ~]# awk '/oldboy/{i=i+1}END{print i}' test.txt
    4
    [root@oldboyedu ~]# awk '/oldboy/{i++}END{print i}' test.txt
    4
    b 数值信息求和运算
    sum=sum+nn 你要对文件第几列信息做求和运算
    # seq 10|awk '{sum=sum+$1}END{print sum}'
    55

    找出有faild信息, 总共出现了多少次 (awk统计)
    难点: windows文件如何传输到linux系统
    yum install -y lrzsz --- 实现windows和linux系统之间数据传输
    rz -- 将windows数据 ---> linux系统
    sz -- 将linux数据 ---> windows系统

    awk '/Failed/{i++}END{print i}' secure-20161219
    awk '$6~/Failed/{i++}END{print i}' secure-20161219'

    相关文章

      网友评论

          本文标题:D19-操作系统awk命令

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