2012-07-20 90 views
3

我试图解析(含sed)刚刚First Last从以下DN(S)由DSCL命令OSX终端庆典环境恢复解析通用名称...正则表达式从专有名称

CN=First Last,OU=PCS,OU=guests,DC=domain,DC=edu

我已经尝试了多个正则表达式从这个网站和其他人的问题非常接近我想要的...主要是this question ...我尝试了以下建议,尽我所能(我不一定认为我自己一个新手...但肯定是一个新手正则表达式..)

DSCL返回DN的列表,我想只将First Last打印到文本文件中。我试图使用sed,但我似乎无法获得正确的功能。我接受其他命令来解析输出。每行以CN=开头,然后在LastOU=之间有一个逗号。

非常感谢您的帮助!

回答

1

使用SED:

sed 's/^CN=\([^,]*\).*/\1/' input_file 
^   matches start of line 
CN=   literal string match 
\([^,]*\) everything until a comma 
.*   rest 
+0

当DSCL返回多行时,这非常适用。 DSCL看起来并不一致,因为它有时会为组中的所有用户返回一行。谢谢! – Ben 2012-07-23 13:17:13

+0

一个CN可以包含逗号的必须被转义,这个正则表达式不适用于这样的名字。 – Air2 2016-09-21 09:03:34

2

两个cut命令可能是最简单(虽然不一定是最好的):

DSCL | cut -d, -f1 | cut -d= -f2 

首先,从DSCL上逗号分割输出并打印在第一场(“CN =第一个最后”);然后将其分成等号并打印第二个字段。

+0

+1因为这是迄今为止最不容易获得正则表达式的人的最简单方法--OP应立即理解它是如何工作的。 – abarnert 2012-07-20 22:01:18

+0

当输出是单行时,我使用了这些剪切命令和'sed'的组合。我衷心感谢您的帮助! – Ben 2012-07-23 13:20:07

0

我喜欢AWK太多,所以我从第四字符打印字符串:

DSCL | awk '{FS=","}; {print substr($1,4)}' > filterednames.txt

4

我认为到目前为止提供的所有正则表达式答案都是错误的,因为它们不能正确处理通用名称中带引号的','字符。例如,可以考虑像的distinguishedName:

CN=Doe\, John,CN=Users,DC=example,DC=local 

最好使用能够解析的distinguishedName的组件的实际库。如果您正在寻找在命令行上的东西快,尝试这样的管道您的DN的命令:

echo "CN=Doe\, John,CN=Users,DC=activedir,DC=local" | python -c 'import ldap; import sys; print ldap.dn.explode_dn(sys.stdin.read().strip(), notypes=1)[0]' 

(取决于是否安装了Python-LDAP库)。你可以使用PHP内置的ldap_explode_dn()函数来制作类似的东西。