好吧,我需要以格式
生成一个带有名称和电子邮件地址的文本文件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命令?
任何帮助都将受到高度赞赏。
问候
德克
答案 0 :(得分:2)
你遇到的问题是ldapsearch
的输出会分开到单独的行,所以当你grep
时,你得到的结果如下:
description: Joe Bloggs
mail: jbloggs@example.com
如果您可以假设所有目录条目都有description
和mail
字段,并且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";
'