LINUX-AWK-1-脚本组成和执行逻辑

一、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块,每个均有匹配条件,上面语句类似条件分支,对不同匹配的行做不同处理
# 且从结果上看,执行顺序是按行执行的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值