使用awk筛选满足条件的igroup行第三列内容
用AWK提取符合条件的Igroup名称
需求说明
提取所有满足以下条件的Igroup名称(即包含"Igroup"行的第三列):该行之后到下一个"Igroup"行之间的所有行,必须全部包含"not logged in"字符串;若中间存在任何一行包含"logged in",则该Igroup不输出。
示例输入
Igroup Name: asdfgsrhqms103 00:00:00:00:00:00:3f:30 (not logged in) 00:00:00:00:00:00:3f:32 (not logged in) Igroup Name: asdfgs012 00:00:00:00:00:00:53:20 (logged in) 00:00:00:00:00:00:fb:1a (logged in) Igroup Name: asdfgs013 00:00:00:00:00:00:52:98 (not logged in) 00:00:00:00:00:00:fa:ec (logged in) 00:00:00:00:00:00:fb:1c (logged in)
AWK解决方案
/Igroup Name:/ { if (prev_igroup && valid) { print prev_igroup } prev_igroup = $3 valid = 1 next } valid { if (/logged in/) { valid = 0 } } END { if (prev_igroup && valid) { print prev_igroup } }
脚本工作原理
- 匹配Igroup行:
- 当遇到以
Igroup Name:开头的行时,先检查上一个记录的Igroup是否有效(valid=1),若是则输出该Igroup名称。 - 然后将当前行的第三列(即Igroup名称)存入
prev_igroup,并初始化valid为1(默认当前Igroup有效)。
- 当遇到以
- 检查后续行:
- 对于非Igroup的行,若当前有正在验证的Igroup(
valid为1),则检查该行是否包含logged in,若是则将valid设为0(标记该Igroup无效)。
- 对于非Igroup的行,若当前有正在验证的Igroup(
- 处理文件末尾:
- 脚本结束时,检查最后一个Igroup的状态,若有效则输出其名称。
运行方式
将上述脚本保存为filter_igroup.awk,然后执行:
awk -f filter_igroup.awk input.txt
或直接在命令行运行:
awk '/Igroup Name:/ {if (prev_igroup && valid) print prev_igroup; prev_igroup=$3; valid=1; next} valid {if (/logged in/) valid=0} END {if (prev_igroup && valid) print prev_igroup}' input.txt
输出结果
asdfgsrhqms103
内容的提问来源于stack exchange,提问作者tgreis
相关产品推荐
相关产品推荐

