linux中 awk命令


作用: 打印((或者格式化打印))用规则处理完的文本       概要   1 语法格式
  • awk 参数 处理规则 文件路径
  • 特点
    • grep、sed和awk都是读一行处理一行
2 参数
  • -F
3 awk的底层执行流程(生命周期)
  • 读一行
  • 用默认或者指定分隔符分割当行文本
  • 处理文本(用处理规则)
  • 处理完的结果赋值给$0
  • 重复一行步骤,读然后处理完所有行
  • 将所有的结果数据交给END{}处理
4 awk中的预定义变量
  • $0
  • $n
  • NF
  • NR
  • FS
  • OFS
5 awk处理规则的执行流程
  • 从上到下,至少有1个
    • BEGIN{}
    • 正则
      • //
    • 循环
      • {}
    • END{}
      • 打印之前最后的处理
6 awk中的函数
  • print 
    • 打印
  • prinf
    • 格式化打印
    • 用到字符
      • %s     : 字符串
      • %d    :数字
      • -        :左对齐
      • +       :右对齐
      • 15      : 至少占用15字符
7 awk的定位
  1. 正则
  2. 比较表达式
  3. 逻辑表达式
  4. 算术表达式
  5. 条件表达式
  6. 范围表达式
8 流程控制
  • if
  • awk 加 for
  • awk 加 while
    ===== 操作演示 =====   ------- 2 参数 -------   -F : 指定文本以xxx为分隔符(默认是以空格作为分隔符)     本语句结果: 打印以xxx为分隔符的最后一列         涉及知识点:             $非零数字: 指代第几列             NF含义:见下面 案例   分析 1 分析系统用户解析器规律     发现: 1)是每行的最后一列 2)前面是冒号 2 解答     -------------------- 4 awk 中 预定义变量 --------------------   $0       代表当前行     awk '{print $0, "---"}' /etc/passwd   $n      代表第n列(n非零)     awk -F: '{print $1}'  文件路径   NF     以xxx为分隔符,统计当前行的字段数     那么$NF          $NF   NR
  • 用来记录文本行号
  FS
  • 指定文本内容分隔符(默认是空格)
    • 优先级要高于 参数-F
  OFS
  • 指定打印分隔符
  --------------- 6 awk中的函数 --------------- printf 格式化打印
  • %s     : 字符串
  • %d    :数字
  • -        :左对齐
  • +       :右对齐
  • 15      : 至少占用15字符
以xxx为分隔符,格式化打印文本内容   以冒号为指定分隔符, 格式化打印 /etc/passwd 中最后一列 第一列内容 以冒号为指定分隔符, 格式化打印 /etc/passwd 中最后一列 第一列内容   ------------- 7 awk的定位 -------------   格式 
  • awk -F指定的分隔符 '定位{print $0}' /etc/passwd
    • 或 awk  '定位{print $0}' /etc/passwd
  7.1 正则定位   7.2 比较表达式(数字才能比较)  
  • <
  • >=
  • <=
  • ~        包含(用于正则匹配)
  • !~        不包含(用于正则匹配)
  案例:要求打印属组ID大于属主ID的行     思路:属组 属主ID分别哪一列   案例:结尾包含bash的行打印出来   案例:结尾不包含bash的行打印出来
  • [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
  7.3 逻辑表达式
  • &&    : 逻辑与
  • ||       :逻辑或
  • !        :逻辑非
  逻辑与 逻辑或
  • [root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
逻辑非   7.4 算数表达式
  • +
  • -
  • *
  • /
  • %
案例 要求属组 + 属主的ID 小于 20     分析: 属组和属主所在列对应值之和小于20             $3 即取第3列对应的值 案例 要求打印偶数行 案例 要求打印奇数行   7.5 条件表达式
  • ==
  • >
  • <
  • >=
  • <=
案例:要求打印第三行   7.6 范围表达式   题目: 打印前3行 ----------- 8 流程控制(仅用于循环中) -----------   if 
  • if(){} 单分支
  • if(){}else{} 双分支
  • if(){}else if(){}else{} 多分支
  for     格式             for(i="初始值";条件判断;游标){}            while
  • 格式
    • i="初始值";while(条件判断){执行语句 ;i++}
案例1     将文件打印两边 案例2     每隔2行打印在下一行打印一行斜线