深圳网站制作公司方案,深圳华强北最新消息,团队建设优缺点,虚拟机可以做多个网站awk模块 awk模块awk的BEGIN模块和END模块BEGIN模块BEGIN 常见错误END模块END模块 常见错误 案例计算1~100的累加和统计系统中有多少用户的shell类型是/bin/bash awk模块
awk的BEGIN模块和END模块
格式
awk BEGIN{}{}END{} 文件名BEGIN模块
用于定义一个动作#xff0c;用{… awk模块 awk模块awk的BEGIN模块和END模块BEGIN模块BEGIN 常见错误END模块END模块 常见错误 案例计算1~100的累加和统计系统中有多少用户的shell类型是/bin/bash 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{sum0}{sum$0}END{print sum}5050详细解释 1.seq命令可以输出连续的数字或者输出固定间隔的数字或者输出指定格式的数字,
2.这里awk 被用来对序列中的每个数字进行累加求和 3.BEGIN{sum0} 部分是 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:;sum0}$NF~/\/bin\/bash$/{sum1}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。
如果包含就执行sum1即将变量sum的值加一。当处理完文件中的所有行后
awk会在END块中打印出sum变量的值这就是以/bin/bash结尾的行数。