Awk를 사용하여 LDAP DN의 하위 문자열 일치

Awk를 사용하여 LDAP DN의 하위 문자열 일치

LDAP 쿼리를 구문 분석한 결과를 찾고 있습니다. 인쇄 중인 DN에서 특정 OU 값을 검색하고 싶습니다.

dn: ObjectName=Value,ou=12,ou=Users,dc=example,dc=com

3개의 속성 값을 검색 중이지만 인쇄하려는 DN의 일부로 ou=[\d]{1,2}만 인쇄하고 싶습니다. 다음은 전체 DN을 제공하는 코드의 예입니다.

<LDAP SEARCH QUERY> | awk -F': ' '/dn: /{dn=$2}/^Attribute1: /{Attribute1=$2}/^Attribute2: /{print dn","Attribute1","$2}'

예제에서 ou=12를 어떻게 구문 분석하는지 잘 모르겠습니다. 나는 성공하지 못한 채 몇 가지 다른 것을 시도했습니다. 나는 이것을 하기 위해 Awk를 사용하고 싶습니다. 왜냐하면 이것은 여러 시스템으로 포팅될 것이고 perl/python은 모든 경우에 옵션이 아니기 때문입니다. grep -o를 사용하는 것과 같지만 대신 awk를 사용하는 것 같습니다.

원하는 출력은 다음과 같습니다.

12,Attribute1,Attribute2

답변1

기본 awk를 사용하는 경우 발견된 dn변수 값을 문자열로 구분된 부분으로 분할한 다음 ",ou="( ou=첫 번째 항목이 아니라고 가정) 숫자를 찾을 수 있습니다(또는 해당 필드가 항상 두 번째 항목임을 알고 있는 경우 분할). 포인트들):

n = split(dn,x,",ou=")
for(i=1;i<=n;i++)if(x[i]+0==x[i])v = x[i]
# or just do:  v = x[2]

예제 입력의 경우 x인덱스 1, 2, 3에서 다음 값을 갖는 배열을 얻습니다.

ObjectName=Value
12
Users,dc=example,dc=com

0문자열에 추가하여 숫자를 테스트합니다. awk는 문자열을 숫자(또는 숫자가 아닌 경우 0)로 변환합니다. 결과가 원래 문자열과 동일하면 간단한 숫자를 얻습니다.

또는 gnu awk가 있는 경우 gensub일치 패턴을 사용하고 ()숫자 부분을 캡처하여 dn전체 값을 바꿀 수 있습니다.

v = gensub(".*,ou=([0-9]{1,2}),.*","\\1",1,dn)

답변2

이것이 내가 한 일입니다.

awk -F': ' '/^dn: /{split($2, ou, "," seps)}/^Attribute1/{Attribute1=$2}/^Attribute2/{print ou[2]","$2","Attribute1}'

"ou="는 여전히 존재하지만 이를 수용하기 위해 스크립트를 쉽게 수정할 수 있습니다.

ou=12,Attribute1,Attribute2

관련 정보