Unix sed从sssd.conf中的ldap\u访问\u筛选器中提取CN

Unix sed从sssd.conf中的ldap\u访问\u筛选器中提取CN,unix,sed,Unix,Sed,我在sssd.conf中定义了ldap\u access\u过滤器,出于某种报告目的,我需要从定义的过滤器中提取CNs(组名) ldap\u访问\u过滤器如下 ldap_access_filter = (|(msSFU30PosixMemberOf=CN=grp1,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com)(msSFU30PosixMemberOf=CN=grp2,OU=UNIX,OU=Security

我在
sssd.conf
中定义了
ldap\u access\u过滤器
,出于某种报告目的,我需要从定义的过滤器中提取
CN
s(组名)

ldap\u访问\u过滤器
如下

ldap_access_filter = (|(msSFU30PosixMemberOf=CN=grp1,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com)(msSFU30PosixMemberOf=CN=grp2,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com)(msSFU30PosixMemberOf=CN=grp3,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com)(msSFU30PosixMemberOf=CN=grp4,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com)(msSFU30PosixMemberOf=CN=grp5,OU=UNIX,OU=Security Groups,OU=Groups,OU=Corp,DC=my,DC=domain,DC=com))
我想要的输出是

grp1, grp2, grp3, grp4, grp5

如何使用
sed
获取此输出


我是
sed
或reg-exp的新手。请帮助我虽然使用
sed
当然可以做到这一点,但您可以使用
grep
awk
获得干净的解决方案

 grep -o 'CN=\w+' Input.txt  | awk -F= '{print $2}'
使用awk:

awk -F"=|," '{while (++i<=NF){if($i~/CN/){print $(i+1)}}}' InputFile

awk-F“=|,”{while(++i这里是一个
gnuawk
(由于RS中有多个字符)


您也可以尝试此sed命令

sed -e 's/CN=\([^,]\+\)/:\1:/g'  -e 's/[^:]\+.\([^:]*\)./\1 /g' FileName 
输出:

grp1 grp2 grp3 grp4 grp5
注意,您的过滤器有(数据)(数据)(数据)(数据)(数据)…您还可以匹配每个CN组,并从五个组中的每个组中获取它们的值

示例

sed '/ldap_access_filter/s/.*(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)/\1, \2, \3, \4, \5/g'
grp1, grp2, grp3, grp4, grp5
来自上述命令行的结果

sed '/ldap_access_filter/s/.*(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)(.*=CN=\([[:alnum:]]*\).*)/\1, \2, \3, \4, \5/g'
grp1, grp2, grp3, grp4, grp5
由于您的筛选器位于一个文件中,因此此部分
/ldap\u access\u filter/
将查找包含
ldap\u access\u filter
的行(这将仅针对您的筛选器)

对于每个组,此

(.*=CN=\([[:alnum:]]*\).*)
在命令行中重复5次以上,以从5个组中提取值