一.三剑客命令awk概念说明

  官方概念说明

  

二.三剑客命令awk作用说明

  1.处理文件信息 : 擅长处理日志文件信息

  2.处理文件方式 :

    01.排除信息  02.查询信息  03.统计信息  04.替换信息

三.三剑客命令awk语法原理

  1.命令语法格式

    01 . 标准格式

      sed  [参数]  '条件-处理方式'  文件

      awk  [参数]  '模式-动作'  文件

    02 . 模式说明

      匹配的条件信息

        普通模式:

          1.正则表达式作为模式

            awk '/^oldboy/{print $n}'

          2.利用比较匹配信息

            NR==2  NR>=2  NR<=2  NR==2,NR==10

         特殊模式: ******

          BEGIN{}

            概念说明:括号里面的内容会在awk读取文件之前执行

            awk 'BEGIN(print "姓","名","QQ号","捐款记录"){print $0}' awk_test.txt

            

            作用说明:

              01.用于测试

              02,用于计算

              03.修改内置变量

              

          END{}

            概念说明:括号里面的内容会在awk读取文件之后执行

            awk 'BEGIN(print "姓","名","QQ号","捐款记录"){print $0}END{print "end of life"}' awk_test.txt

            

            作用说明:

              01.显示计算最终结果

              02,用于计算

    03 . 内置变量

      FS(file separator-文件分隔符)     字段分割符变量               -F ":"==BEGIN{FS=":"}==-vFS=":"

      NR(number records(记录))       表示行数信息                  awk 'NR==1' awk_test.txt

      NF(number of fields(域))        表示每一行有多少列(调用即为最后一列)    awk '$2~/Xiaoyu/{print $NF}' awk_test.txt  

  2.命令执行过程

    

 

 

     与sed命令执行过程基本类似,也是从文件第一行,一行一行进行条件匹配,只不过有点区别是sed 会将模式空间中的内容输出到屏幕上,而awk不会, awk会看满足条件的行是否有动作,再决定是否将信息输出到屏幕上

四.三剑客命令awk实践操作

  1.实践环境创建

  2.命令操作实践

    01.查询实践

      001.查找实践参数

        指定列的分隔符号(参数)    -F ":"    ---- 指定以 : 为分隔符

        显示指定行号信息(模式)    NR==n   ---- 第 n 行信息

        显示指定列的信息(动作)    print     ---- 将信息打印到屏幕上

                         gsub    ---- 对显示出信息进行替换操作

      002.查找案列说明

        按行查找文件数据信息

          awk 'NR==1' awk_test.txt

        按字符查找文件数据信息

          awk '/155/' awk_test.txt

        按行按列查找文件数据信息

          awk 'NR==1{print $1 $2}' awk_test.txt

          awk -F "[ :]+" 'NR==1{print $1 $2 $(NF-1)}' awk_test.txt

            [ :]+   以空格和:作为分隔符  +的意思是将连续的空格或: 看做一个整体

            (NF-1)  NF意为最后一个字符.NF-1即为倒数第二行

          awk '$3~/0+/' awk_test.txt

            $3    第三列

            ~       表示匹配或者包含什么信息

            !~    表示不匹配或者不包含什么信息

          

    02.查询测验

      001.按照行号查询信息

        awk 'NR==1' awk_test.txt      查找单行信息

        awk 'NR==1,NR==3' awk_test.txt    查找连续多行信息

        awk 'NR==1;NR==3' awk_test.txt    查找不连续多行信息

        

      002.显示字符查询信息

        awk '/Xiaoyu/' awk_test.txt        查找单行信息

        awk '/Xiaoyu/,/Waiwai/' awk_test.txt    查找连续多行信息

        awk '/Xiaoyu/;/Waiwai/' awk_test.txt    查找不连续多行信息

        

 

 

       003.显示Xiaoyu的姓氏和id号码

        1.条件:  找出Xiaoyu所在行

        2.动作:  显示此行指定列的信息 print 

        3.思路:  按照Xiaoyu找出对应行,利用{print  $n,$m} 匹配多列 将信息打印出来  

        4.实践:  awk '/Xiaoyu/{print $1","$3}' awk_test.txt

        

 

 

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

        1.条件:  找出姓氏是Zhang的所在行信息

        2.动作:  显示当前行指定列的信息

        3.思路:  按照Zhang找出所在行并列出最后一列,观察列出的列是以 :为分割符的, 利用-F参数.将:分割的列再进行分列.找出第二次捐款的信息,将两条命令合并,将分割符也合并.注意合并分割符的时候用  "[ ]"  ,因为每列之间的空格往往很多没办法判断,此时加个+ 意为将多个连续的空格看成一个分割符, 再将所需要的信息列出

        4.实践:  awk -F "[ :]+" '/Zhang/{print $1,$2,$(NF-1)}' awk_test.txt

        

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

        1.条件:  显示以41开头的id号  id号码在当前文件的第三列  考虑利用  ~ 匹配信息

        2.动作:  显示当前列所在行的指定信息

        3.思路:  利用~的作用匹配第三列满足特定条件的信息

        4.实践:  awk '$3~/^41/{print $1,$2,$3}' awk_test.txt

        

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

        1.条件:  显示指定列以1或5结尾  利用~匹配特定条件,条件中运用  |  匹配多个条件    

        2.动作:  显示当前行所在列的信息  column -t  将显示的信息列纵队. 即对齐

        3.思路:  ~ 对第三列进行最后一个字符条件匹配   | 连接多个或者关系条件   [] 多个条件存在或者关系

        4.实践:  awk '$3~/1$|5$/{print $1,$2}' awk_test.txt | column -t

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

        

      007.显示Xiaoyu的捐款,每个捐款前面都以$开头,如$110$220$330

        1.条件:  按照字符找出对应行信息

        2.动作:  显示捐款信息,再数值前赋值$  利用gsub的替换功能  --- gsub(/需要替换的信息/,"修改成什么信息",$n-操作那一列)

        3.思路:  找出第二列指定字符的是Xiaoyu的行并打印最后一列,对打印出来的列,进行额外的动作,执行gsub替换,把 : 替换成$符号    注意 gusb是个动作,需要跟print放到一起,又因为是两个不同的指令,所以中间需要用 ; 分割开

        4.实践:  awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt

        

      008.文件中空行/注释行进行排除

        1.条件:  按照条件找出对应行

        2.动作:

        3.思路:  $0  即意为全部信息     /^$|^#/  空行和以#开头的信息.    $0!   取反,即不需要匹配出来的信息

        4.实践:  awk '$0!~/^$|^#/' awk_test.txt

        

    总结:awk命令中$符号的用法

     $1 $2 $3 :   取第几列信息
        $NF        :   取最后一列
        $(NF-n)  :   取倒数第几列
        $0           :   取所有列的信息

    03.特殊模式:特殊模式应用案例

      1.统计/etc/services中空行数量

       

       

      2.统计/etc/services文件中有#开头的行

       

      2.统计/etc/passwd文件中有多少普通用户  虚拟用户

       步骤一:用户信息存放文件  /etc/passwd 

       步骤二:从文件中匹配出虚拟用户 普通用户  普通用户是/bin/bash 结尾的   awk '$NF~/bash/' /etc/passwd

       步骤三:进行统计    awk '$NF~/bash/{i++}END{print i}'  /etc/passwd

       

      3.统计文件中的数值的和

       sum=sum+$n(需要进行数值求和的列)

          

五.三剑客命令awk数组详述

  1.数组知识学习准备 :  统计计算方法说明

    i=i+1:

      步骤一: 先计算右边,将右边数值给左边变量

      步骤二: i=0  i=0+1  i=1+1    .....    统计次数

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

    i=i+$0:

      步骤一: 表示对每行的数字进行累加求和运算

      步骤二: i=0 i=0+$0 i=$0(上一行)+$0       求和运算

    列:  seq 10|awk '{sum=sum+$n;print $n,sum}'      $n  指定想把第几列信息做求和运算       

  2.数组概念知识说明

    数组形式说明        

      hotel[110]="张三"
         hotel      数组名称
           [110]       数组元素
           "张三"     元素内容    

    数组实际应用        

     awk 'BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}'
        awk -F "[/.]+" '{h[$2]++}END{for(pol in h) print pol,h[pol]}' url.txt