我有一个日志文件,用于观察用户在网络上的操作,该文件包含来自 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
或者cut
&tr
cut -d'=' -f2 file | tr -d 'ou,'