从 LDAP 长名称中提取名称

从 LDAP 长名称中提取名称

我有一个日志文件,用于观察用户在网络上的操作,该文件包含来自 LDAP 的信息,非常长的列表,如下所示:

2015-12-02 10:55:32Z cn=jsmith,ou=sales,dc=company,dc=com
2015-12-02 10:55:54Z cn=bjones,ou=sales,dc=company,dc=com

我只想提取cn名称:

jsmith
bjones

我该怎么做?

答案1

使用sed

sed -e 's/.*cn=\(.*\),ou.*/\1/' file

使用awk

awk -F '[=,]' '{print $2}' file

或者

awk -F 'cn=|,' '{print $2}' file

答案2

% < input
2015-12-02 10:55:32Z cn=jsmith,ou=sales,dc=company,dc=com
2015-12-02 10:55:54Z cn=bjones,ou=sales,dc=company,dc=com
% perl -nle 'print $1 if m/ cn=([^,]+)/' input
jsmith
bjones

假设逗号不会出现在记录名称中(这使得正则表达式更快)并且cn=不会出现在日志中的其他位置。

此匹配的缺点是属性可能很长或包含会在其他地方引起问题的字符。如果这是一个问题,那么严格定义cn属性可能包含的内容的限制可能会有所帮助,然后匹配该定义,例如cn=([a-z][a-z0-9]{1,63})假设属性只能是小写,以字母开头,长度为 2 到 64 个字符。如果出现长度超过 64 个字符的属性,这可能会导致问题,但另一方面,不会让反引号或通配符通过不良代码,从而造成不幸的事情。

答案3

可以通过以下方式完成sed

sed 's/^.*cn=\([^,]*\).*$/\1/' file

jsmith
bjones

或者grep

grep -oP  '(?<=cn=)[^, ]+' file

或者perl

perl -lne '/cn=(\w*),/ && print $1' file

或者cuttr

cut -d'=' -f2 file | tr -d 'ou,'

相关内容