嗯,我需要生成一个文本文件,其名称和电子邮件地址的格式为
姓名、电子邮件地址
来自 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 命令?
任何帮助将不胜感激。
问候
德克
最佳答案
您遇到的问题是 ldapsearch
的输出会打印到单独的行,因此当您 grep
时,您会得到如下内容:
description: Joe Bloggs
mail: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="39535b55565e5e4a795c41585449555c175a5654" rel="noreferrer noopener nofollow">[email protected]</a>
如果您可以假设所有目录条目都有一个 description
和 mail
字段,并且 ldapsearch
将始终按此顺序输出它们,然后您可以将 grep
的结果通过管道传输到 sed
(为了清楚起见,这里显示为多行):
ldapsearch ... |
grep -e '^(description|mail):' |
sed -e 'N;s/description: \(.*\)\nmail: \(.*\)/\1, \2/;P;D'
此 sed 脚本将行分成两部分,然后运行正则表达式替代(请注意,这不一定是可移植的,因此您可能需要进行试验)以删除字段名称,打印并删除其当前缓冲区,因此它可以移动到下一对。您也许能够生成一个神奇的正则表达式,它不关心 ldapsearch
返回字段的顺序,但生命太短了!
关于regex - 从 ldapsearch 的输出创建名称/电子邮件文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13193010/