awk命令进阶操作(二)

awk模块

awk的BEGIN模块和END模块

格式

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的累加和

 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

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结尾的行数。
  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值