4

我正在尝试仅从OSX 终端bash环境中的命令返回的以下 DN解析(使用sed) ...First LastDSCL

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

我已经尝试了该站点的多个正则表达式以及其他与我想要的问题非常接近的问题......主要是这个问题......我已经尽我所能尝试遵循建议(我不一定认为自己是新手。 ..但绝对是正则表达式的新手..)

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

非常感谢您的帮助!

4

6 回答 6

6

我认为到目前为止提供的所有正则表达式答案都是错误的,因为它们没有正确处理公用名中带引号的“,”字符。例如,考虑如下的 distinctName:

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() 函数来制作类似的东西。

于 2013-04-30T13:37:17.117 回答
2

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

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

首先,用逗号分割输出DSCL并打印第一个字段(“CN=First Last”);然后将其拆分为等号并打印第二个字段。

于 2012-07-20T15:48:54.080 回答
1

http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators

awk -v RS=',' -v FS='=' '$1=="CN"{print $2}' foo.txt
于 2012-07-20T16:37:48.787 回答
1

使用 sed:

sed 's/^CN=\([^,]*\).*/\1/' input_file
^           matches start of line 
CN=         literal string match
\([^,]*\)   everything until a comma
.*          rest
于 2012-07-20T15:57:19.377 回答
0

我也喜欢 awk,所以我打印第四个字符的子字符串:

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

于 2012-07-22T17:24:34.077 回答
0

此正则表达式将解析一个专有名称,为每个匹配项提供name和捕获组。val

当 DN 字符串包含逗号时,它们应该被引用 - 此正则表达式正确处理带引号和不带引号的字符串,并且还处理带引号的字符串中的转义引号:

(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+

这是很好的格式:

(?:^|,\s?)
(?:
    (?<name>[A-Z]+)=
    (?<val>"(?:[^"]|"")+"|[^,]+)
)+

这是一个链接,因此您可以看到它的实际效果: https ://regex101.com/r/zfZX3f/2

如果您希望正则表达式获取 CN,则此改编版本将执行此操作:

(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))

于 2018-04-03T10:20:33.953 回答