AWK命令无法捕获许可证过期日期及空用户行处理咨询
修正后的AWK命令及说明
针对你提到的两个问题——无法捕获Expiry Date、输出包含空用户的无效行,以下是修正后的AWK命令,假设你的许可证日志采用字段名: 值的常见格式:
BEGIN { print "License Name,User,Total Number of Licenses,Number of licenses used,Expiry Date,License Checkout Date,Server name" FS = ": " # 设置分隔符为冒号加空格,适配"字段名: 值"格式 } # 逐一匹配并提取目标字段 /License Name:/ { lic_name = $2 } /Total Number of Licenses:/ { total_lic = $2 } /Number of licenses used:/ { used_lic = $2 } /Expiry Date:/ { expiry = $2 } # 新增这行专门捕获过期日期 /User:/ { user = $2 } /License Checkout Date:/ { checkout = $2 } /Server name:/ { server = $2 } # 假设每条许可证记录以空行分隔,遇到空行时检查输出 /^$/ { # 只输出User非空的有效记录 if (user != "") { printf "%s,%s,%s,%s,%s,%s,%s\n", lic_name, user, total_lic, used_lic, expiry, checkout, server } # 重置变量,避免跨记录污染 lic_name = total_lic = used_lic = expiry = user = checkout = server = "" } # 处理日志末尾无空行的情况 END { if (user != "") { printf "%s,%s,%s,%s,%s,%s,%s\n", lic_name, user, total_lic, used_lic, expiry, checkout, server } }
核心修正细节
解决Expiry Date捕获问题:
新增了/Expiry Date:/ { expiry = $2 }的匹配规则,精准定位过期日期字段。如果你的日志里过期日期的标识不是Expiry Date:,比如是License Expires:,直接把正则改成/License Expires:/即可。过滤空用户的无效行:
在输出前加入if (user != "")判断,只有当User字段有实际值时才输出记录,直接剔除无效条目。避免字段值污染:
每条记录输出后重置所有变量,确保下一条记录的字段值不会和上一条混在一起。
适配你的日志格式的小调整
- 如果日志的字段分隔符不是
:(比如用=分隔),把FS = ": "改成FS = "="。 - 如果记录不是用空行分隔,而是有特定分隔符(比如
=====),把/^$/改成对应正则(比如/^=====$/)。
内容的提问来源于stack exchange,提问作者IamBayMax
相关产品推荐
相关产品推荐

