2

好吧,我需要生成一个带有名称和电子邮件地址的文本文件,格式为

姓名、电子邮件地址

来自 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 命令?

任何帮助将不胜感激。

问候

短剑

4

2 回答 2

2

你遇到的问题是ldapsearch线轴的输出到单独的行,所以当你grep,你会得到类似的东西:

description: Joe Bloggs
mail: jbloggs@example.com

如果您可以假设您的所有目录条目都有一个descriptionandmail字段并且ldapsearch将始终按此顺序输出它们,那么您可以将结果通过管道grep输入sed(为清楚起见,此处显示为多行):

ldapsearch ... |
grep -e '^(description|mail):' |
sed -e 'N;s/description: \(.*\)\nmail: \(.*\)/\1, \2/;P;D'

sed脚本将行分成两行,然后运行正则表达式替换(注意,这不一定是可移植的,因此您可能需要试验)以删除字段名称,打印并删除其当前缓冲区,以便它可以移动到下一对. 您也许可以生成一个不关心字段返回顺序的神奇正则表达式ldapsearch,但生命太短了!

于 2012-11-02T10:43:58.633 回答
1

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

perl -00 -ne '
    /(?<=description: )(.*$)/m and print "$1, ";
    /(?<=mail: )(.*$)/m and print "$1\n";
'
于 2012-11-02T13:33:09.413 回答