美文网首页
2019-06-19

2019-06-19

作者: 男子瀚 | 来源:发表于2019-06-19 21:35 被阅读0次

    1. awk三剑客命令概述

                # which awk--------查看awk在哪个目录下

    显示:  /usr/bin/awk

                # ll /usr/bin/awk

    显示: lrwxrwxrwx. 1 root root 4 May 31 16:06 /usr/bin/awk -> gawk    ------查看awk更详细的信息

                # man awk

    显示: gawk - pattern scanning and processing language

                解析: 模式扫描(条件匹配)and 程序语言

    awk: 擅长取列  擅长统计分析(nginx zabbix tomcat ... SSH)ELK awk

    03. awk三剑客命令执行原理

        参见示意图

    04. awk三件可命令语法结构

        awk [参数] '模式(条件){动作}(指令)'  文件信息

    05. awk三剑客命令实践操作:查询 排除 替换

        部署准备环境

    cat > oldboy.txt <<EOF 

    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

    EOF

    2. 实践操作练习:

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

        # awk '/Xiaoyu/{print $1 $3}' oldboy.txt

        Zhang390320151

        # awk '/Xiaoyu/{print $1,$3}' oldboy.txt

        Zhang 390320151

        # awk '/Xiaoyu/{print $1" "$3}' oldboy.txt

        Zhang 390320151

        按照指定列进行搜索信息Xiaoyu        问题是内容中有两个Xiaoyu

        # awk '/Xiaoyu/' oldboy.txt        --- 将匹配信息的行直接显示

        Zhang  Xiaoyu    390320151  :155:90:201

        Xiaoyu zhang    390320151  :155:90:201

        # awk '$2~/Xiaoyu/' oldboy.txt    --- 指定列信息匹配  解决方法

        Zhang  Xiaoyu    390320151  :155:90:201

        # awk '$2!~/Xiaoyu/' oldboy.txt    ----表示将指定列信息取返

        Zhang  Dandan    41117397    :250:100:175

        Xiaoyu zhang    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

        显示xiaoyu的姓氏和ID号:满足要求,正确语法格式

        # awk '$2~/Xiaoyu/{print $1,$3}' oldboy.txt

        Zhang 390320151

    PS:awk命令默认区分大小写不需要加i    没有类似grep命令 -i参数功能

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

            第一历程:找出姓氏是张的人

            # awk '$1~/Zhang/' oldboy.txt

                Zhang  Dandan    41117397    :250:100:175

                Zhang  Xiaoyu    390320151  :155:90:201

              第二历程:显示出名字信息 和所有捐款记录

              # awk '$1~/Zhang/{print $2,$4}' oldboy.txt

              Dandan :250:100:175

              Xiaoyu :155:90:201

    PS:在使用-F的参数下,awk默认使用空格进行作为列分隔符

              第三历程:指定字符信息作为分隔符

              # awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' oldboy.txt

              Dandan 100

                Xiaoyu 90

        总结:

    01. awk默认使用空格分隔列

    02. 可以使用-F 指定分隔列的符号信息

    03. 利用-F "[: ]+"  +表示将多个连续的分隔符汇总为一个整体

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

    第一个历程:找出匹配id号码是41开头的行信息 --- 找出东西(模式写好)

    # awk '$3~/^41/' oldboy.txt

                      Zhang  Dandan    41117397    :250:100:175

                      Liu    Bingbing  41117483    :250:100:175

    第二个历程:显示出人的全名 和 ID号码      --- 对找出东西进行处理(执行动作)

                        # awk '$3~/^41/{print $1,$2,$3}' oldboy.txt|column -t

                        Zhang  Dandan    41117397

                        Liu    Bingbing  41117483

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

    第一个历程:找出id号码以1或5结尾信息  --- 找出信息

    方法一:awk '$3~/1$|5$/' oldboy.txt

    方法二:awk '$3~/[15]$/' oldboy.txt

    第二个历程:显示全名信息              --- 找出信息做处理

    awk '$3~/[15]$/{print $1,$2}' oldboy.txt|column -t

        05. 显示文件中第二行,第三列的信息

    第一个历程:匹配第二行

    # awk 'NR==2' oldboy.txt

                        Zhang  Xiaoyu    390320151  :155:90:201

    第二个历程:显示第三列

    awk 'NR==2{print $3}' oldboy.txt

            测试. 利用awk取出IP地址信息(grep sed)

    第一个历程:定位有IP地址的行          --- 找出信息

    ip a s eth0|awk 'NR==3'

                      inet 10.0.0.201/24 brd 10.0.0.255 scope global eth0

    第二个历程:只显示IP地址              --- 做处理  为什么是三前面和后面都有隐藏一个^ $

    ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'

                      10.0.0.201

        说明:在不指定-F参数信息,

          1. 默认将多个连续的空格汇总为整体

          2. 默认将一行头部开始空格信息忽略不计

      ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'

                        10.0.0.201

      06. 显示Xiaoyu的捐款,每个捐款数值都有以$开头, 如$110$220$330

    方法一:

    # awk -F "[:]" '$2~/Xiaoyu/{print "$"$2"$"$3"$"$4}' oldboy.txt  ???

                      $155$90$201

    方法二:

    # awk  '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'

                      $155$90$201

                    # awk  '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"

                      $155$90$201

                      方法三:awk替换功能  sed tr

    gsub(/要替换的信息/,"替换成什么",将第几列进行替换)

    # awk  '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt

                        $155$90$201

              07.利用awk排除指定信息不要显示

    awk '!/^$/' oldboy.txt

    06. awk命令高级功能说明:

        普通模式  正则表达式作为模式  ^ 还可以表示某一列的开始

                                        $ 还可以表示某一列的结尾

        比较表达式作为模式:

                # awk 'NR==1{print $NF}' oldboy.txt

                  :250:100:17

        范围模式:

                  awk 'NR==1;NR==2' oldboy.txt    --- 只查看第1和第2行

                  awk 'NR==1,NR==3' oldboy.txt    --- 查看第一到第三行

        特殊模式  BEGIN  在处理文件之前先执行的动作

        1)生成文件内容表头信息

              # awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}' oldboy.txt |column -t

                  姓氏    名称      id号码      捐款记录

                  Zhang  Dandan    41117397    :250:100:175

                  Zhang  Xiaoyu    390320151  :155:90:201

                  Xiaoyu  zhang    390320151  :155:90:201

                  Meng    Feixue    800412789  :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

        2)用于在系统中进行运算数值

    awk 'BEGIN{print 2+3}'

        3) 修改或设置变量信息

              a awk命令中,会直接将字符串信息当成变量  $1 $NF $0(取一行中所有列)

              # awk 'BEGIN{oldboy=62;print oldboy}' -------设置变量

                    62

              # awk 'BEGIN{oldboy=62;print "oldboy"}' -----不想识别出变量

                    oldboy

    自定义变量:oldboy=62

    内置变量:

    NF : 显示最后一列信息  $(NF-1) 取倒数第2列

    NR : 表示行号信息,取出第几行  NR==2 NR>=2 NR<=2

    FS : 指定分隔符信息  -F

                    # awk -F ":" 'NR==1{print $2}' oldboy.txt

                    250

                    # awk  'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt

                    250

                    # awk -vFS=":" 'NR==1{print $2}' oldboy.txt

                    250

      END    在处理文件之后再执行的动作 ***

              1)显示表格补充信息

                # awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}END{print "总结:这是一个学生登记表"}' oldboy.txt|column

                  姓氏 名称 id号码 捐款记录

                  Zhang  Dandan    41117397    :250:100:175

                  Zhang  Xiaoyu    390320151  :155:90:201

                  Meng  Feixue    800412789    :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

                  总结:这是一个学生登记表

              2)显示计算的最终结果 OK

              awk '/^$/{i=i+1}END{print i}' /etc/services

    07. awk运算方法:

        1)累加运算:a b c d  1+1+1+1

      i=i+1 --> i++

      练习题01:统计一个文件中有多少个空行

      第一个历程:找出空行

      awk '/^$/' /etc/services

      第二个历程:做运算处理

      # awk '/^$/{i=i+1;print i}' /etc/services

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          14

          15

          16

          17

          # awk '/^$/{i=i+1}END{print i}' /etc/services

          17

      练习题02:统计/etc/passwd文件中最后一列有/sbin/nologin的出现了多少次

          [# awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd

          17

          # awk '/nologin$/{i++}END{print i}' /etc/passwd

          17

        2)求和运算: 10 20 30 60

      i=i+$n

          实践操作:

          # seq 10|awk '{i=i+$1;print i}'

          1

          3

          6

          10

          15

          21

          28

          36

          45

          55

          # seq 10|awk '{i=i+$1}END{print i}'

          55

    08. 课程知识总结:

        1)awk三剑客命令概述

      1)作用:擅长取列 擅长统计运算

      2)语法:awk 参数 '模式{动作}' oldboy.txt

          模式:常用模式 特殊模式(BEGIN END)

      3)原理:

    2)awk三剑客命令练习

      6道题  查(匹配信息) 修改替换  删除

      awk命令参数:

      -F  : 指定分隔符号信息  ":"  "[:/]"  "[:/]+"

      -v  : 设置变量信息

      awk命令动作:

      print: 打印输出信息  空格 , " "  字符串 "oldboy"  变量信息  oldboy  指定列 $1 $NF $(NF-1) $0(所有列)

      gsub:  替换指定列的信息  gsub(/要替换的内容/,"替换成什么",$N)

      计算:

      累加运算:i=i+1  i++

      求和运算:i=i+$n  

      awk内置变量:

      FS NF NR

    相关文章

      网友评论

          本文标题:2019-06-19

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