awk命令进阶操作(二)

awk模块

awk模块

awk的BEGIN模块和END模块

格式

bash 复制代码
awk 'BEGIN{}{}END{}' 文件名

BEGIN模块

  • 用于定义一个动作,用{}表示要执行的动作
  • 这个动作要再读取文件之前执行
  • 这里的动作大多用于定义变量,包括内置变量、自定义变量

BEGIN 常见错误

  • 对BEGIN块的误解:许多初学者可能会误以为BEGIN块只在处理第一个输入记录时执行。实际上,BEGIN块会在处理任何输入之前执行一次,因此如果期望它在每个记录上都执行,这将导致逻辑上的错误
  • 变量初始化问题:在BEGIN块中未正确初始化变量可能导致意外,如果尝试在BEGIN块中使用一个未声明的变量,或者使用了一个预期为数组但被当作普通变量使用的数组元素,这可能会导致程序崩溃或产生不可预测的结果
  • 正则表达式使用的限制:虽然不是专门针对BEGIN块,但在awk中使用正则表达式时需要注意其性能影响。特别是在处理大量数据时,不恰当的正则表达式可能会显著降低程序的效率

END模块

END模块

  • 用于定义一个动作,用{}表示要执行的动作
  • 这个动作是awk将文件中的内容读取完成后,而且处理完成后,END模块才会执行
  • 这里的动作一般用于输出一个解释

END模块 常见错误

awk的END模块常见错误主要包括以下几点:

  • END模块使用错误 :END模块只能有一个,尝试使用两个END模块(END{}END{})是错误的
    这意味着在awk脚本中,应该只定义一个END块,用于在所有输入行处理完成后执行特定的操作。
  • END模块中的循环问题 :虽然可以在END模块中使用循环来遍历数组等数据结构
    ,但是需要注意的是,循环的下标关键字可能不会从0开始,这可能会导致对数组元素访问的预期之外的结果。
  • END模块的默认行为:需要注意的是,BEGIN和END规则必须有动作;这意味着在使用END模块时,必须明确指定要执行的操作,否则可能会因为缺少必要的命令而导致预期之外的行为。

案例

计算1~100的累加和

bash 复制代码
 seq 100 | awk 'BEGIN{sum=0}{sum+=$0}END{print sum}'
 5050

详细解释

1.seq命令可以输出连续的数字,或者输出固定间隔的数字,或者输出指定格式的数字,

2.这里awk 被用来对序列中的每个数字进行累加求和

3.BEGIN{sum=0} 部分是 awk 的 BEGIN 特殊模式,它在 awk 处理任何输入之前执行一次。这里初始化变量 sum 为 0,准备用于累加求和

4.{sum+=$0} 部分是 awk 的正常模式,它对每一行(在这个场景中是序列中的每个数字)执行。$0 表示当前行的全部内容,这里将其累加到 sum 变量中

5.END{print sum} 部分是 awk 的 END 特殊模式,它在 awk 处理完所有输入之后执行一次。这里输出变量 sum 的值,即序列中所有数字的总和

统计系统中有多少用户的shell类型是/bin/bash

bash 复制代码
awk 'BEGIN{FS=":";sum=0}$NF~/\/bin\/bash$/{sum+=1}END{print sum}' /etc/passwd
1.给定的awk命令是用于统计/etc/passwd文件中以/bin/bash结尾的行数

2.在awk中$NF表示当前记录的最后一个字段
因此,这个命令通过将每行的最后一个字段与正则表达式/bin/bash$进行匹配,
来判断该行是否以/bin/bash结尾。如果匹配成功,就将变量sum加一
最后,在END块中打印出sum变量的值,即为满足条件的行数。

3.BEGIN{FS=":"}这行代码设置了字段分隔符为冒号(:),这是因为/etc/passwd文件中的每个条目是以冒号分隔的。
接下来,对于文件中的每一行,awk会检查其最后一个字段($NF)是否包含字符串/bin/bash。
如果包含,就执行sum+=1,即将变量sum的值加一。当处理完文件中的所有行后,
awk会在END块中打印出sum变量的值,这就是以/bin/bash结尾的行数。
相关推荐
彷徨而立34 分钟前
查看 linux 系统信息
linux
c无序1 小时前
【Linux】倒计时|进度条|git|gdb的实现
linux
GDAL2 小时前
深入解析Node.js中的new URL()构造函数:功能、属性、方法与使用技巧
linux·运维·node.js
sangexinx3 小时前
docker 数据存储
linux
WKJay_3 小时前
Linux 常用命令 - lsblk 【查看磁盘(块设备)使用情况】
linux·服务器·windows
C-DHEnry3 小时前
技术献文-小白如何正确使用Linux(1-基础篇)
linux·运维·服务器
陈大爷(有低保)3 小时前
Linux终端命令
linux·运维·服务器
小朝说技术3 小时前
Linux 学习
linux·运维·服务器·后端·学习
hxj199108144 小时前
k8s在mac和linux下的安装步骤
linux·macos·kubernetes
我是大头鸟4 小时前
centos 系统yum 安装 mariadb
linux·centos·mariadb