네트워크에서 사용자의 작업을 관찰하는 데 사용하는 로그 파일이 있는데, 이 파일에는 다음과 같은 매우 긴 목록의 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,'