Linux awk

awk

  用于格式化文本,支持变量、支持循环

  1、语法

    awk [参数] [处理规则] [操作对象]

  2、参数

    -F 指定分割符,默认为空格

    $NF 分割后的最后一个 字段

  3、生命周期

    grep sed awk 都是读一行处理一行,直到处理完成

    1)接收一行作为输入

    2)把读入的内容进行分解

    3)使用处理规则进行处理

    4)输入一行赋值给$0,直到处理完成($0代表当前行的内容)

    5)把处理完后的所有数据,交给END{}来再次处理

  4、预定义变量

    $0  当前行

    $n  第n列

    NF  当前行分割的段数

    NR  当前的等号(不是文本内部的行号)

    FS  指定分割符 相当于-F ,优先级高于-F

      awk 'BEGIN{FS=";"}{print $NF}'

    OFS  指定打印分隔符(默认空格)

      awk 'BEGIN{OFS=">>>"}{print $NF,$1}'

  5、处理规则的执行流程

    BEGIN{}  定义变量

    //  正则

    {}  循环

    END{}

  6、函数

    print  打印

    printf  格式化输出

      %s  字符串

      %d  数字

      -   左对齐

      +     右对齐

      15  至少占用15个字符

  7、定位

    1)正则表达式

      正则规划写在//中间,awk -F: '/^root/{print $0}' /etc/passwd

    2)比较表达式

      > >= < <=

      ~ 正则匹配  包含

      !~ 正则匹配  不包含

      用户id大于组id awk -F: '$4>$3{print $0}' /etc/passwd  

      结尾包含bash   awk -F: '$NF ~ /bash/ {print $0}' /etc/passwd, !~ 表示不包含

    3)逻辑表达式

      &&  ||  !

    4)算术表达式

      +  -  *  /  %

      awk -F: '$3 + $4 > 2000{print $0}' 

    5)条件表达式

      ==  >  <  >=  <=

      awk -F: 'NR == 3{print $0}' /etc/passwd 

    6)范围表达式

      从以root开头的行,到ftp开头的行: awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd 

  8、流程控制

    只存在于循环之中

    if  三种结构: if(){}  if(){}else{}  if(){}else if(){}else{}

      awk -F: '{if ( $3 > $4 ) {print "大于"} else {print "小于"}'

    for 

      for (i=;;;){}

      awk -F: '{for (i= 10;i>0;i--){print $0}}' /etc/passwd 

    while

      while(){}

      awk -F: '{i= 1;while(i<10){print $0,i++}'} /etc/passwd 

      第隔5行打印-------------

      awk -F: '{if (NR%5==0) {print '---------------' } print $0}'  /etc/passwd 

posted on 2021-12-24 17:18  秋不语  阅读(48)  评论(0)    收藏  举报

导航