zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    Hadoop组件
    Vmworkstation启用错误
    sqoop
    ZooKeeper02
    动物管理员--zooKeeper-01
    IP-v4&IP-v6
    hive 基础
    ssh连接失败,排错经验
    Hadoop管理员的十个最佳实践
    OSGi在淘宝内部的使用
  • 原文地址:https://www.cnblogs.com/xwxxh/p/13815906.html
Copyright © 2011-2022 走看看