2019-06-19

2019-06-19  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读