使用awk或其他工具对多行数据列表(ldif文件)进行操作

我试图操纵多个条目的ldif文件。 我的目的是parsing这个现有的ldif文件,提取“givenName”和“sn”属性,从而生成一个“邮件”属性。 我正在考虑AWK或Sed,但不幸的是,我不是两个很好的工具的专家。 一个例子:

原始文件

dn: cn=fremer, ou=people, dn=domain, dn=com cn: fremer givenName: Freddy sn: Mercury dn: cn=markno, ou=people, dn=domain, dn=com cn: markno givenName: Mark sn: Knopfler 

输出:

 dn: cn=fremer, ou=people, dn=domain, dn=com mail: [email protected] dn: cn=markno, ou=people, dn=domain, dn=com mail: [email protected] 

dn是需要的,因为我将把生成的ldif传递给LDAP更新的“ldapadd”。 任何build议或提示我应该在哪里看? 谢谢!

你可以用awk脚本来做到这一点

 #!/bin/awk -f /^dn:/ {split($0,dname,", dn=");print $0 } /^cn:/ { cn = $2 } /^givenName:/ { gn = tolower($2) } /sn:/ { sn = tolower($2) ; printf("mail: %s.%s@%s.%s\n\n",gn,sn,dname[2],dname[3] ) } 

使用,保存上面的文件,例如awkscript,然后使其可执行

 ./awkscript datafile 

给你input这个脚本输出

 dn: cn=fremer, ou=people, dn=domain, dn=com mail: [email protected] dn: cn=markno, ou=people, dn=domain, dn=com mail: [email protected] 

对于多行的东西,我总是回到Perl或其他东西,让我写一个半可读的方式的实际数据结构。 您实际上可以编写可读的Perl代码; 一旦awk命令超过了几十个字符,我就无法读取它。 一点也不说不能做; 我只是不知道该怎么做。

Perl的额外好处是你可以find(或者已经有)一个LDAP / LDIF模块,所以你不必自己parsing它。 Perl的潜在缺点是必须select其中的一个模块。 一般来说,任何名字中的“简单”都可能是你最好的出发点。