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行打印在下一行打印一行斜线
 
 
 
posted @ 2021-12-22 21:18  tslam  阅读(236)  评论(0编辑  收藏  举报