awk基本使用

一、awk概述

  akw是一种编程语言,主要用于在Linux和Unix下对文本和数据进行处理,是Linux和Unix下的一个工具。数据可以来自标准输入,一个或多个文件,或其他命令的输出。

  awk的处理文本和数据的方式是逐行扫描文件,默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。

二、使用方法

  1、命令行模式

  1)格式

    awk [选项] ['命令部分'] 文件名

    注:命令部分为shell变量时需要用双引号

    选项说明:

      -F:定义字段分隔符,默认的分隔符是空格

      -v:定义变量并赋值

    '命令部分'说明:

      正则表达式来地址定位

        '/root/{awk语句}'      sed中:'/root/p'      //打印文件中包含root的行

        'NR==1,NR==5{awk语句}'    sed中:'1,5p'        //打印1-5行内容

        '/^root/,^ftp/{awk语句}'   sed中:'/^root/,/^ftp/p'  //打印root开头和ftp开头的行内人

      {awk语句1;awk语句2;...}

        '{print $0;print $1}'    sed中:'p'         //打印内容,awk语句之间需要用分号隔开

        'NR==5{print $0}'      sed中:'5p'         //打印第5行

      BGEIN...END...

        'BEGIN{awk语句};{处理中};END{awk语句}'

        'BEGIN{awk语句};{处理中}'

        '{处理中};END{awk语句}'

  2、脚本模式

    #!/bin/awk -f  //定义魔法字符

三、awk内部相关变量

  $0:当前处理行的所有记录

  $n:当前记录的第n个字段,字段间由分隔符分隔     awk -F: '{print $1,$3}' 

  NF:当前记录的字段数(列数)            //awk -F: 'print NF'

  $NF:最后一列                   //$(NF-1)表示倒数第二列

  FNR/NR:行号

  FS:定义输入间隔符                  //awk 'BEGIN{FS=":"};{print $1,$3}'  此时跟awk -F: '{print $1,$3}'是一样的

  OFS:定义输出字段分隔符,默认空格          //awk -F: 'BEGIN{OFS="==>"};{print $1,$3}',输出的$1==>$3,也可以awk -F: '{print $1"==>"$3}这么写

  RS:输入记录分隔符,默认换行            //awk -F: 'BEGIN{RS=" "};{print $1,$3}',相当于以 来分隔列

  

  ORS:输出记录分隔符,默认换行            //awk -F: 'BEGIN{ORS=" "};{print $1,$3}',输出用 来分隔

四、格式化输出print和printf

  1、print,类似echo

    date|awk '{print "年份:"$1,"时间:"$4"}'

    [xwxxh@xw shell]$ date|awk '{print "年份:" $1,"时间:" $4}'

    年份:2020年 时间:星期四  

  2、printf,类似echo -n  不换行

    awk -F: '{printf "%-15s %-10s %-15s" $1,$2,$3}' /etc/passwd

    

    说明:%s:字符类型为字符串,%d为数字类型

       %-15s:占用15个字节的字符串,'-'为左对齐方式,默认为右对齐

五、awk变量定义 

  #awk -v num=2 -F: '{print $num}' /etc/passwd  num前加了$符号,此时会打印以:为分隔符的第num列 

  #awk -v num=2 -F: '{print num}' /etc/passwd   num前不加$符号,此时有多少行就会打印多少个num 

  

   #awk -v num=1 'BEGIN{print num}'

  

  #awk -v num=1 'BEGIN{print $num}',打印内容为空 

  注:awk中调用定义的变量时不需要加$

六、awk中BEGIN...END...的运用 

  1、BEGIN:表示在程序开始之间执行

  2、END:表示所有文件处理完成后执行

  3、用法:'BEGIN{开始处理之前};{处理中};END{处理结束后}'

  

七、awk的if和if...else...结构

  1、if结构

    格式:awk [选项] '{if(表达式) {语句1;语句2....}}' 文件名

       

  2、if...else结构

    格式:awk [选项] '{if(表达式) {语句1;语句2...} else {语句3;语句4...}}' 文件名

     

   3、if...elif..else结构

    格式:awk [选项] '{if(表达式1) {语句1;语句2...} else if(表达式2) {语句3;语句4...} else {语句5...}}' 文件名

    

   4、for循环结构

     #打印1-5

    

    #打印1-10之间的和

     

   5、while循环结构

    #打印1-5

    

    #打印1-10之间的和

      

   6、嵌套循环

    #命令行模式打印

    

    #awk结构打印

    

  7、统计/etc/passwd中shell的数量

    

     shell[$NF]++:关联数组,awk遍历每一行,遇到相同的值就会加1 

原文地址:https://www.cnblogs.com/xwxxh/p/13815906.html