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

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

我正在尝试操作一个包含多个条目的 ldif 文件。我的目的是解析这个现有的 ldif 文件,提取“givenName”和“sn”属性,从而生成“mail”属性。我考虑过 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 并将其传递给“ldapadd”进行 LDAP 更新。有什么建议或提示我应该在哪里查看吗?谢谢!

答案1

你可以用 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

根据您的输入,此脚本输出

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

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

答案2

对于多行内容,我总是会使用 Perl 或其他允许我以半可读方式编写实际数据结构的语言。您实际上可以编写可读的 Perl 代码;一旦 awk 命令超过几十个字符,我就无法读取它。并不是说这做不到;我只是不知道怎么做。

Perl 的另一个好处是您可以找到(或已经拥有)LDAP/LDIF 模块,因此您不必自己解析它。Perl 的潜在缺点是必须选择其中一个模块。一般来说,名称中带有“Simple”的任何模块可能都是您最好的起点。

相关内容