linux三剑客之awk

作用

  主要是用来格式化文本

语法格式

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

参数

  -F : 指定文本分隔符(默认是以空格作为分隔符)

 awk的生命周期

  1、接收一行作为输入

  2、把刚刚读入进来的文件进行分解

  3、使用处理规则处理文本

  4、输入一行,赋值给$0 ,直至处理完成

  5、把处理完成之后的所有数据交给END{ }来再次处理

awk中的预定义变量

  1、$0 :代表当前行

   2、$n : 代表第n列

   3、NF :记录当前行的字段数

   可以结合$一起使用

   4、NR :用来记录行号

   注:这个行号不是文本内容在文本中的行号,这个行号相当于自己命令的的计数器

  5、FS :指定文本内容分隔符(默认是空格)

   注:FS和-F的意思差不多,但是优先级要高于-F

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

 awk处理规则

  1、BEGIN{ }:是在awk处理文本之前运行

  2、/ /  :使用的是正则字符串或正则表达式

  3、{ } :循环(每次只处理一行数据)

  4、END{ } : 当所有的处理全部执行完毕之后,执行END中的相关操作

  5、案例

    1、把/etc/passwd中的包含root的行打印出来

     2、把/etc/passwd中以root开头的行打印出来

     3、将/etc/passwd中匹配第三列和第五列的数据

     4、打印以root或者ntp开头的行的解析器

 awk中的函数

  1、print:打印

  2、printf:格式化打印

   $s:字符串

  $d:数字

   +:右对齐

   -:左对齐

  20(不固定):至少占用的字符

awk中的定位

  1、正则表达式

    格式:awk -F: '/正则表达式' /  [文件路径]

  2、比较表达式

>           大于           
<           小于
>=         大于等于
<=         小于等于
~         正则匹配
!~          正则匹配(取反)

案例1:要求打印属组ID大于属主ID的行
    [root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
        
案例2:结尾包含bash
    [root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}'/etc/passwd
        
案例3:结尾不包含bash
    [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd

  3、逻辑表达式

&&    : 逻辑与
||  :逻辑或
!    :逻辑非

[root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
[root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

  4、算术表达式

+-*/%      取余

案例1:要求属组 + 属主的ID 大于 2000
    [root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
案例2:要求属组 * 属主的ID 大于 2000
    [root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
案例3:要求打印偶数行
    [root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
案例4:要求打印奇数行
    [root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

  5、条件表达式

>           大于           
<           小于
>=         大于等于
<=         小于等于

  6、范围表达式

    相当于sed里面的正则正则

 awk中的流程控制

  流程控制只存在于循环{ }中

  1、if判断

    1、格式

       单分支  if( ){ }

       双分支  if( ){ }else{ }

       多分支  if(){}else if(){}else{}

    2、案例

       打印奇数行的数据

       打印偶数行的数据

     要求在奇数行前输出奇数,偶数行前输出偶数

   2、for循环

    1、格式      for( i=" 初始值 ";条件判断;游标){ }

   3、while循环

    格式  while(条件判断){ }

   案例:每隔5行,打印一行横线

 

posted @ 2021-12-22 17:03  那就凑个整吧  阅读(43)  评论(0编辑  收藏  举报