ldapsearch将格式化的表输出到文件awk

时间:2018-12-05 11:49:57

标签: file awk format output tabular

我从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

1 个答案:

答案 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 }'