首页 > 解决方案 > 清理这串 sed 命令

问题描述

好的,所以我的最终目标是生成一个包含 AD 组及其成员列表的 CSV 文件。我正在使用ldapsearch命令提取原始数据,并为与模式匹配的每个组请求“dn”和“member”属性。结果数据如下所示:

dn: CN=BLAH_GROUP1,OU=blah,OU=blah,dc=com
member: CN=John Smith,OU=blah,OU=blah,dc=com
member: CN=Dave Smith,OU=blah,OU=blah,dc=com

dn: CN=BLAH_GROUP2,OU=blah,OU=blah,dc=com
member: CN=Mike Smith,OU=blah,OU=blah,dc=com
member: CN=Chad Smith,OU=blah,OU=blah,dc=com

dn: CN=BLAH_GROUP3,OU=blah,OU=blah,dc=com

dn: CN=BLAH_GROUP4,OU=blah,OU=blah,dc=com
member: CN=Diane Smith,OU=blah,OU=blah,dc=com
member: CN=Amy Smith,OU=blah,OU=blah,dc=com
member: CN=Rebecca Smith,OU=blah,OU=blah,dc=com

有些行会换行并缩进,所以我只是忽略任何以空格开头的行。

我正在寻找的最终结果:

BLAH_GROUP1,John Smith,Dave Smith
BLAH_GROUP2,Mike Smith,Chad Smith
BLAH_GROUP2
BLAH_GROUP4,Diane Smith,Amy Smith, Rebecca Smith

我得到了我的结果,但只能通过 sed 管道输出 3 次,我只是认为可能有一种更清洁的方法可以到达那里:

当前解决方案:

ldapsearch blah |                       # Generate data
sed -n '/^[^ ]/s/,.*//p' |              # Remove the wrapped lines and OU lists
sed ':x;/^dn{N;s/\nmember CN=/,/;bx}' | # Replace "member CN=" with "," and add to prev line
sed 's/dn: CN=//'                       # Remove "dn: CN="

我试过用多个-e实例运行这些,但它没有给出相同的结果。

标签: regexawksed

解决方案


重写@Cyrus 的解决方案

$ awk -F'[=,]'  '/^dn: /     {a=$2} 
                 /^member: / {a=a "," $2} 
                 !NF         {print a} 
                 END         {print a}' file

推荐阅读