usando sed
:
sed -e 's/.*cn=\(.*\),ou.*//' file
usando awk
awk -F '[=,]' '{print $2}' file
ou
awk -F 'cn=|,' '{print $2}' file
Eu tenho este arquivo de log que observa as ações do usuário na rede, o arquivo contém informações do LDAP, lista muito longa como esta:
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
Eu quero extrair apenas os nomes cn
:
jsmith
bjones
como posso fazer isso?
usando sed
:
sed -e 's/.*cn=\(.*\),ou.*//' file
usando awk
awk -F '[=,]' '{print $2}' file
ou
awk -F 'cn=|,' '{print $2}' file
% < 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
nos pressupostos de que uma vírgula não aparecerá no nome do registro (o que torna a expressão regular rápida) e que cn=
não aparece em outro lugar no log.
As desvantagens dessa correspondência são que o atributo pode ser muito longo ou conter caracteres que causam problemas em outro lugar. Se isso for uma preocupação, pode ser útil definir estritamente os limites que os atributos cn
podem conter e, em seguida, corresponder a essa definição, por exemplo, cn=([a-z][a-z0-9]{1,63})
assumindo que os atributos só podem ser minúsculos, inicie com uma letra e tenha de 2 a 64 caracteres. Isso pode causar problemas se atributos maiores que 64 caracteres aparecerem, mas, por outro lado, não permitirá que backticks ou globs passem por esse código ruim.
pode ser feito com sed
:
sed 's/^.*cn=\([^,]*\).*$//' file
jsmith
bjones
ou grep
grep -oP '(?<=cn=)[^, ]+' file
ou perl
perl -lne '/cn=(\w*),/ && print $1' file
ou cut
& tr
cut -d'=' -f2 file | tr -d 'ou,'
Tags sed