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

















浙公网安备 33010602011771号