我从LDAP中检索所有kerberos用户(但只有他们的一些变量,例如kerberosid,location,邮件,名称,姓氏...)到平面文件中(分隔符是管道)。
我尝试使用LDAPSEARCH into table format 中的LDAP语法 但是我的意思是混合值(我可以在下一行看到例如相同的名称,但是文件的下一行以第二个LDAP记录开头,依此类推) 性能很重要。
我希望在缺少值的位置甚至留空字符串。我不确定是否不会发生这种情况,因为在某些先前的记录中,整个索引(例如邮件变量)丢失了,并且所有位置都从此位置转移了。
链接中的代码块:
$ ldapsearch -x -D "cn=something" | awk -v OFS=',' '{split($0,a,": ")} /^mail:/{mail=a[2]} /^uidNumber:/{uidNumber=a[2]} /^uid:/{uid=a[2]} /^cn/{cn=a[2]; print uid, uidNumber,cn , mail}' > ldap_dump.csv
Lapap搜索输出:
dn: xxxxx
objectClass: top
mail: 11111
uidNumber: 222 222
uid: 333, 3333
cn: 44444
somethingnext: 5555
dn: new records
objectClass: top
mail: aaaaa
uidNumber: bbbbb
uid: cccc, cccc
cn: ddddd
somethingnext: eeeee
每行在新行上,并且记录之间为空新行
Needed output in a file should be :
11111|222 222|333, 3333|44444
aaaaa|bbbbb|cccc, cccc|ddddd
答案 0 :(得分:0)
使用以下awk
:
awk 'BEGIN{RS=""; OFS="|"}
{ mail = cn = uidNumber = uid = ""
for(i=1;i<=NF;++i) {
if ($i ~ /^mail:/) { mail=substr($i,7) }
else if ($i ~ /^uidNumber:/) { uidNumber=substr($i,12) }
else if ($i ~ /^uid:/ ) { uid=substr($i,6) }
else if ($i ~ /^cn:/ ) { cn=substr($i,5) }
}
print mail,uidNumber,uid,cn
}'
原始版本的正确版本是:
awk 'BEGIN{FS=": *"; OFS="|"}
(NF==0) { print uid,uidNumber,cn,mail }
(NF==0) { mail = uidNumber = uid = cn = ""; next }
{split($0,a,": ")}
/^mail:/{mail=a[2]}
/^uidNumber:/{uidNumber=a[2]}
/^uid:/{uid=a[2]}
/^cn/{cn=a[2]}
END{ print uid,uidNumber,cn,mail }'