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结尾的行数。
相关推荐
watermelonoops1 小时前
Deepin和Windows传文件(Xftp,WinSCP)
linux·ssh·deepin·winscp·xftp
疯狂飙车的蜗牛2 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
远游客07134 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<4 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟4 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
cominglately7 小时前
centos单机部署seata
linux·运维·centos
魏 无羡7 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse7 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux8 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算