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

标签 regex awk ldap grep

嗯,我需要生成一个文本文件,其名称和电子邮件地址的格式为

姓名、电子邮件地址

来自 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>

如果您可以假设所有目录条目都有一个 descriptionmail 字段,并且 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/

相关文章:

bash - 了解 bash 中的嵌套进程替换,以及一点点 awk

linux - awk 按列对特定组求和

awk : an other way more elegant to do it ? 看到里面了吗?

java - Java 中的搜索结果

powershell - PowerShell 中 Active-Directory Get-ADComputer 的 LDAP 查询

ruby - 字符串:用数字替换空格

php - PHP中的正则表达式元字符\w和\pL

regex - 客户端被 tomcat 的服务器配置拒绝

JavaScript 正在将\n 转换为\r\n

ruby - ldap访问权限不足