Correspondência de substring no DN do LDAP usando o Awk

0

Estou procurando analisar a saída de uma consulta LDAP. Desejo recuperar um valor OU específico no DN que estou imprimindo

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

Estou recuperando 3 valores de atributos totais, mas só quero que o ou = [\ d] {1,2} seja impresso como parte do DN que estou imprimindo. Aqui está um exemplo do meu código que fornece o DN completo:

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

Não sei como analisar o ou = 12 no exemplo. Eu tentei vários diferentes, mas não consegui. Eu gostaria de usar o Awk para fazer isso, pois isso será portado para vários sistemas e o perl / python não é uma opção em todos os casos. Eu suponho que é como usar o grep -o, mas usando o Awk.

Aqui está a saída desejada:

12,Attribute1,Attribute2
    
por drfunkenstein 10.04.2018 / 19:12

2 respostas

0

Veja o que acabei fazendo:

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

O "ou=" ainda está lá, mas posso modificar facilmente meu script para acomodar.

ou=12,Attribute1,Attribute2
    
por 12.04.2018 / 17:11
1

Se você usar apenas o awk básico, poderá dividir o valor encontrado da variável dn em partes separadas pela string ",ou=" (assumindo que ou= não é o primeiro) e procurar por um número (ou obter o segundo item da divisão se você sabe que é sempre esse campo):

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]

Para sua entrada de exemplo, você obteria no array x no índice 1, 2 e 3, os valores:

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

Testamos um número adicionando 0 à string. O awk converte a string para um número (0 se não for um número). Se o resultado for o mesmo da string original, temos um número simples.

Como alternativa, se você tiver o gnu awk, poderá usar gensub para corresponder ao padrão e capturar com () a parte do número, substituindo todo o valor dn :

v = gensub(".*,ou=([0-9]{1,2}),.*","\1",1,dn)
    
por 11.04.2018 / 11:55