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行,打印一行横线