如何解析ldapsearch输出并生成结构化的Zimbra账户分析数据?
如何解析ldapsearch输出并生成结构化的Zimbra账户分析数据?
我明白你的痛点了——ldapsearch输出的Zimbra账户数据字段顺序不固定,有的记录还缺字段,直接用简单的awk或grep处理会乱成一锅粥。别担心,我们可以用awk做针对性的字段提取,不管字段在记录里的位置,都能输出你想要的结构化行格式。
解决方案:用定向提取的awk脚本处理
我们可以把每个账户的所有行作为一个独立的记录,然后在每个记录里精准提取你需要的字段,最后按固定顺序输出。直接把这个命令替换你原来的awk部分就行:
ldapsearch -H $ldap_master_url -w $zimbra_ldap_password -D $zimbra_ldap_userdn -S -LLL -x "(&(objectClass=zimbraAccount)(!(objectclass=zimbraCalendarResource)))" zimbraMailDeliveryAddress zimbraLastLogonTimestamp zimbraPrefMailForwardingAddress | awk -v RS= -v FS='\n' -v OFS=',' '{ # 初始化字段变量为空,避免残留上一条记录的值 mail=""; logon=""; forward="" # 遍历当前账户记录的每一行 for (i=1; i<=NF; i++) { # 匹配并提取邮箱地址 if ($i ~ /^zimbraMailDeliveryAddress: /) { split($i, arr, ": ") mail = arr[2] } # 匹配并提取最后登录时间 else if ($i ~ /^zimbraLastLogonTimestamp: /) { split($i, arr, ": ") logon = arr[2] } # 匹配并提取转发地址 else if ($i ~ /^zimbraPrefMailForwardingAddress: /) { split($i, arr, ": ") forward = arr[2] } } # 按固定顺序输出三个字段,缺失字段会留空 print mail, logon, forward }'
脚本逻辑解释
RS=:把每个账户的所有行(空行分隔的块)作为一个单独的处理单元FS='\n':把每个账户块里的每一行拆成独立的字段- 遍历每一行时,通过正则匹配字段名,用
split把冒号后的实际值提取出来 - 最后强制按「邮箱地址,最后登录时间,转发地址」的顺序输出,完全不受原数据字段顺序影响
扩展更多字段的方法
如果之后需要添加更多字段(比如zimbraCOSId),只需要在循环里加一段对应的匹配逻辑,然后在print里加上新变量就行:
# 新增提取COS ID的逻辑 else if ($i ~ /^zimbraCOSId: /) { split($i, arr, ": ") cosid = arr[2] } # 输出时加上cosid print mail, logon, forward, cosid
这个方法完美解决了字段顺序混乱、部分字段缺失的问题,输出的结果直接就是可以导入表格工具分析的CSV格式,完全符合你的需求。
备注:内容来源于stack exchange,提问作者dj423
相关产品推荐
相关产品推荐

