linux:awk的使用
Linux:awk的使用
awk主要用来格式化文本
一、awk的语法
格式:awk 【参数】【处理规则】【操作对象】
二、参数
-F:指定文本分割符(默认是以空格作为分隔符)
awk -F'f' '{print $NF}' 9.txt 'f' 这里是设置分隔符
1 打印系统所有用户的解析器 2 awk -F: '{print $NF}' /etc/passwd
三、awk的生命周期
grep、sed和awk都是读一行处理一行,直至处理完成完成
1.接收一行作为输入
2.把刚刚读入进来的到文本进行分解
3.使用处理规则处理文本‘
4.输入一行,赋予给$0,直至处理完成
5.把处理完成之后的所有的数据交给END{}来再次处理
四、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 [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处理规则的执行流程
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
// 分割字符串
{} 存放输入命令集
六、awk中的函数
print 打印 printf 格式化打印 %s 字符串 %d 数字 - 左对齐 + 右对齐 [root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd 里面的15是至少占用15字符
七、awk中的定位
1.正则表达式
[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd [root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
2.比较表达式
> 大于 < 小于 >= 大于等于 <= 小于等于 ~ 正则匹配 !~ 正则匹配(取反)
1 案例:要求打印属组ID大于属主ID的行 2 [root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
1 案例:结尾包含bash 2 [root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
1 案例:结尾不包含bash 2 [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
3.逻辑表达式
&& : 逻辑与(和) || :逻辑或(或) ! :逻辑非(不)
1 [root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd 2 [root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd 3 [root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
4.算术表达式
+ 加法 - 减法 * 乘法 / 除法 % 取余
1 案例:要求属组 + 属主的ID 大于 2000 2 [root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
1 案例:要求属组 * 属主的ID 大于 2000 2 [root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
1 案例:要求打印偶数行 2 [root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
1 案例:要求打印奇数行 2 [root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
5.条件表达式
== 对等 > 大于 < 小于 >= 大于等于 <= 小于等于
1 [root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
6.范围表达式
1 [root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
八、流程控制
只存在循环之中
if
1 [root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
格式:单分支 if(){} 双分支 if(){}else{} 多分支 if(){} if(){}else{}
for
1 [root@localhost ~]# awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
for(i="初始值";条件判断;游标){} 游标:每次处理变量
while ;分割
1 [root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
格式:while(条件判断){}
1 每隔5行,打印一行横线 2 ------------------------------------------------------------------------- 3 4 [root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd