从ldapsearch的输出创建名称/电子邮件文本文件

时间:2012-11-02 10:00:39

标签: regex awk ldap grep

好吧,我需要以格式

生成一个带有名称和电子邮件地址的文本文件

name,emailaddress

来自ldapsearch的输出。但这并不像看起来那么简单(至少对我而言)。

我正处于有电子邮件地址列表的位置:

 ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | grep "^mail: .*$" | awk '{print $2}'

以及名单列表:

 ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | grep "^description: .*$" | awk '{print $2,$3}'

但无论我尝试过什么 - 我没有得到一个命令给我我需要的清单如上所示...

这个命令给了我姓名和电子邮件 - 但不是一行:

ldapsearch -x -b ou=<somevalue>,ou=<somevalue>,ou=<somevalue>,dc=<somevalue>,dc=<somevalue> objectClass=posixAccount | awk '/description:|mail:/{print $2,$3}'

有没有办法制作一个很酷的正则表达式来解决这个问题? 或者是一些我不会想到的精彩shell命令?

任何帮助都将受到高度赞赏。

问候

德克

2 个答案:

答案 0 :(得分:2)

你遇到的问题是ldapsearch的输出会分开到单独的行,所以当你grep时,你得到的结果如下:

description: Joe Bloggs
mail: jbloggs@example.com

如果您可以假设所有目录条目都有descriptionmail字段,并且ldapsearch将按此顺序始终输出它们,那么您可以管道{{{}的结果1}}进入grep(为清晰起见,此处显示在多行上):

sed

ldapsearch ... | grep -e '^(description|mail):' | sed -e 'N;s/description: \(.*\)\nmail: \(.*\)/\1, \2/;P;D' 脚本将行分为两行,然后运行正则表达式替换(请注意,这不一定是可移植的,因此您可能需要进行实验)以删除字段名称,打印并删除其当前缓冲区,所以它可以移动到下一对。您可能能够生成一个魔术正则表达式,它不关心sed返回字段的顺序,但是生命太短了!

答案 1 :(得分:1)

如果我记得,这个ldap输出记录用空行分隔,所以你可以写:

perl -00 -ne '
    /(?<=description: )(.*$)/m and print "$1, ";
    /(?<=mail: )(.*$)/m and print "$1\n";
'