![使用 awk 或其他工具操作多行数据列表(ldif 文件)](https://linux22.com/image/559284/%E4%BD%BF%E7%94%A8%20awk%20%E6%88%96%E5%85%B6%E4%BB%96%E5%B7%A5%E5%85%B7%E6%93%8D%E4%BD%9C%E5%A4%9A%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%88%97%E8%A1%A8%EF%BC%88ldif%20%E6%96%87%E4%BB%B6%EF%BC%89.png)
我正在尝试操作一个包含多个条目的 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”的任何模块可能都是您最好的起点。