awk按模式解析文本 仅输出单条auth msg对应连接记录的方法
问题根因
你写的原脚本运行不符合预期,核心是三处错误:
- 字段索引取值错误:连接行格式为
This connection from x.x.x.x,IP是第4个字段,你代码里取的$6是空值;auth消息行格式为auth msg from XXX,来源标识是第4个字段,你取的第8个字段不存在对应内容 - 判断逻辑有缺陷:仅用
getline读取连接行的下一行做判断,既没有统计该连接后续auth消息的总条数,也没有处理两条连接行之间穿插多条auth、或者连接行后直接跟新连接行的场景 - 遗漏了文件末尾的记录判断:如果最后一条连接符合输出规则,原脚本完全不会处理到
正确awk实现
实现逻辑:逐行遍历日志,遇到连接行时先校验上一条暂存的连接是否满足「恰好1条auth消息」的输出条件,满足就输出结果;之后暂存当前新连接的IP,重置auth计数和来源缓存。遍历过程中遇到auth消息行时,仅给当前暂存的连接累加auth计数、缓存来源。所有行遍历完成后,再补校验最后一条暂存的连接是否符合输出条件。
awk ' /connection from/ { # 先处理上一个暂存的连接记录 if (current_ip != "") { if (auth_count == 1) { print current_ip, auth_src } } # 初始化当前新连接的缓存 current_ip = $4 auth_count = 0 auth_src = "" next } /auth msg from/ { # 仅在存在待匹配连接时统计auth信息 if (current_ip != "") { auth_count++ auth_src = $4 } next } END { # 处理文件末尾最后一条暂存的连接 if (current_ip != "" && auth_count == 1) { print current_ip, auth_src } } ' 你的日志文件路径
效果验证
用你提供的样例输入执行上述脚本,输出结果和预期完全一致:
x.x.x.x BBB y.y.y.x CCC x.x.x.a ZZZ
内容的提问来源于stack exchange,提问作者kadu
相关产品推荐
相关产品推荐

