一、AWK脚本组成
脚本分别三部分
- BEGIN:主要用于设置变量,如预置变量FS(输入的域分割符), OFS(输出的域分割符)和用户自定义变量sum=9等; 以及输出表头(配合使用printf函数)之类的动作
awk 'BEGIN{FS="Apr"; sum=9} NR>1{print $2} END{print sum+=NR}'
上面命令中BEGIN设置了域分割符为字串"Apr"和自定义变量sum=9
[root@rabbit-api-001 test]# ll
total 32
-rw-r--r-- 1 root root 32 Apr 27 08:12 a.txt
-rw-r--r-- 1 root root 48 Apr 27 08:15 b.txt
-rw-r--r-- 1 root root 208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 root root 288 Apr 26 15:36 func.sh
-rw-r--r-- 1 root root 108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 root root 100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 root root 82 Apr 27 09:49 test.txt
-rw-r--r-- 1 root root 218 Apr 26 16:06 user.txt
[root@rabbit-api-001 test]# ll|awk 'BEGIN{FS="Apr"; sum=9} NR>1{print $2} END{print sum+=NR}'
27 08:12 a.txt
27 08:15 b.txt
26 14:59 casedemo.sh
26 15:36 func.sh
26 14:48 loop.sh
26 15:19 recase.sh
27 09:49 test.txt
26 16:06 user.txt
18 #此结果是end部分代码把sum=9加上ask处理的行数(9)
[root@rabbit-api-001 test]# ll|awk 'BEGIN{FS="Apr"; sum=9} NR>1&&/sh/{print $2} END{print sum+=NR}'
# 可以使用&& 或 ||来组合匹配模式
26 14:59 casedemo.sh
26 15:36 func.sh
26 14:48 loop.sh
26 15:19 recase.sh
18
- BODY :处理数据的主体,按行循环处理, 格式:【[pattern] {statement}】,匹配模式可是使用预置变量、字段、正则等
- END:可以进行结果的汇总和数据的处理
- 以上三部分均可以带多条语句,使用分号";"分割
二、脚本执行逻辑
脚本按BEGIN - BODY (按行循环)- END顺序来执行(BODY非AWK的关键字,只是为了表示脚本主体的意思)
- BEGIN和END均为可选部分,在主体数据处理前后,分别执行且只执行一次
- 按行依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行对应的statement
- 允许有多个BODY块
awk 'BEGIN{FS="Apr"; sum=9} NR>1&&/sh/{print $2} NR>1&&/txt/ {print $2"******"$1} END{print sum+=NR}'
[root@rabbit-api-001 test]# ll
total 32
-rw-r--r-- 1 root root 32 Apr 27 08:12 a.txt
-rw-r--r-- 1 root root 48 Apr 27 08:15 b.txt
-rw-r--r-- 1 root root 208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 root root 288 Apr 26 15:36 func.sh
-rw-r--r-- 1 root root 108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 root root 100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 root root 82 Apr 27 09:49 test.txt
-rw-r--r-- 1 root root 218 Apr 26 16:06 user.txt
[root@rabbit-api-001 test]# ll|awk 'BEGIN{FS="Apr"; sum=9} NR>1&&/sh/{print $2} NR>1&&/txt/ {print $2"******"$1} END{print sum+=NR}'
27 08:12 a.txt******-rw-r--r-- 1 root root 32
27 08:15 b.txt******-rw-r--r-- 1 root root 48
26 14:59 casedemo.sh
26 15:36 func.sh
26 14:48 loop.sh
26 15:19 recase.sh
27 09:49 test.txt******-rw-r--r-- 1 root root 82
26 16:06 user.txt******-rw-r--r-- 1 root root 218
18
# 以上命令有2个body块,每个均有匹配条件,上面语句类似条件分支,对不同匹配的行做不同处理
# 且从结果上看,执行顺序是按行执行的