/* 看板娘 */ /* 粒子吸附*/

awk

1、awk

awk主要是用来格式化文本

语法结构

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

参数

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

  eg:

     

 

 

 

   打印系统所有用户的解析器

  

 

 awk -F: '{print $NF}' /etc/passwd      

      $NF打印最后一列         

 awk 的生命周期  

 三剑客都是读一行处理一行,直至处理完成

  1、接受一行作为输入

  2、把刚刚读入进来得到的文本进行分解

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

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

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

 4、awk的预定义变量

$0

代表当前行

[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd

$n

代表第n 列

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd

 

NF

记录当前行的字段数

[root@localhost ~]# awk -F: '{print NF}' /etc/passwd

$NF打印最后一列

[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd 

NR

用来记录行号

[root@localhost ~]# awk -F: '{print NR}' /etc/passwd

 相当于迭代器

FS

指定文本内容分隔符(默认空格)

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd

FS的优先级要高于-F

OFS

指定打印分隔符

[root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd

 

 

 awk  处理规则的执行流程·

 至少有一个,最多有四个

  (1)  BEIGIN{ }     >>>>>>定义文本变量

  (2)  //                 >>>>>>定义正则

  (3)  { }               >>>>>>定义循环

  (4)  END{ }       >>>>>>大一之前在统一处理一遍

 注意:执行顺序位1>2>3>4

  

6、awk 的函数

  print    >>>>>>>打印

  printf    >>>>>>>格式化打印    

  %s      >>>>字符串

  %d     >>>>数字

  — : >>>>左对齐

  +   :>>>>右对齐
  15  :>>>>至少占用15字符

[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd

 

awk中的定位

  1、正则

  eg:      包含root 的行

     

          

   以root 开头的

        

 

   忽略大小写

        

  2、比较表达式

     eg: 要求打印属组ID 大于属主ID的行

       

 

     比较表达式的符号

        >

        <

        >=

        <=

        ~正则匹配

        !~ 正则匹配取反

     结尾包含bash的行

            

    结尾不包含bash的

              

  3、逻辑表达式

    

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


案例1:(与(两者条件必须都成立))
    awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd

案例2:(或(两者条件一个成立即可))
    awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
  
案例3:(非(条件取反))
    awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

   

  4、算数表达式

+    :加
    -    :减
    *    :乘
    /
    %    :除
    

1.要求匹配打印出属组 + 属主的ID 大于 2000 的
案例1:
    awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
    
2.要求属组 * 属主的ID 大于 2000
案例2:
    awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd

3.要求打印偶数行
案例3:
    awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
解析:
    NR  :全部行号 除以 2 == 零的 零等于余数
  
 偶数 : 2 4 6...
 
4.要求打印奇数行
案例4:
    awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
    
    NR  :全部行号 除以 2 == 1的 零等于奇数

奇数: 1 3 5...

 

  5、条件表达式

==        
    >
    <
    >=
    <=

要求打印第三行
案例1:
    awk -F: 'NR == 3{print $0} /etc/passwd'
解析:
    NR  : 行号
NR == 3  : 行号等于3


注意:
$1         : 是列
NR == 3  : 是行

 

        

  6、范围表达式

简介:
    流程控制只存在循环之中

if:
    awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
解析:
    判断文件 第三列大于第四列的话打印(大于) 不大于 else

if 使用格式:
if(){}                   : 但分支
if(){}else{}            : 双分支
if(){}else if(){}else{}    : 多分支


for每一行打印10次
for 使用格式
    awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
解析:
    i-- 相当于python中的 i-=1   : i=i-1
    减到条件不成立为止
    格式:
    fro(i="初始值":条件判断:游标){}
    
while每一行打印10次
while 使用格式
    awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
解析:
    i++ 相当于python中的 i+=1
    加到条件不成立为止
    格式:
    while(条件判断){}

实战案例(if判断打印隔五一行线)

1.使用if判断
每隔5行,打印一行横线
awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd
解析:
    1. NR    : 每一行的行号
    2. 行号 除以 5 ==0
    3. 打印一行
    以此类推 4%5=0.8

 

  

 

posted @ 2021-12-22 17:58  红绿灯的黄呀  阅读(174)  评论(0)    收藏  举报