Filtrando texto com AWK
Nestes últimos dias precisei tratar alguns dados exportados de uma base LDAP e, a partir destes, gerar um arquivo CSV. Seguem os comandos executados com as devidas explicações.
Só para facilitar o entendimento, explico antes os nomes dos arquivos:
ldapteste2.ldif – arquivo com os dados exportados do LDAP
ldapteste2.csv – arquivo de saída gerado após o tratamento dos dados
$ awk -v OFS=';' '{split($0,a,": ")} /^uid/{uid=a[2]} /^cn/{cn=a[2]} /^department/{dep=a[2]; print uid, cn, dep}' ldapteste2.ldif >> ldapteste2.csv
Explicando os parâmetros:
-v OFS=';'
A sintaxe é -v var=val -> o -v é para setar uma variável antes do início do programa. Neste caso, a variável “OFS” recebeu o valor “;”.
Variável “OFS”
Output Field Separator -> indica o caracter que será usado para separar os campos na saída. O padrão é o espaço. No meu caso, usei o “;”.
'{split($0,a,": ")} /^uid/{uid=a[2]} /^cn/{cn=a[2]} /^department/{dep=a[2]; print uid, cn, dep}'
O código acima foi aplicado em um conjunto de registros que estavam no formato abaixo (cada 4 linhas representam um registro do arquivo LDIF exportado da base LDAP):
dn: CN=FULANO DE TAL,OU=RJ,O=BR cn: FULANO DE TAL uid: FDTAL department: VENDAS/RJ
A saída gerada ficou da seguinte forma:
FDTAL;FULANO DE TAL;VENDAS/RJ
Explicando:
O que está entre chaves são os comandos, declarações e funções da linguagem AWK
1ª parte: {split($0,a,”: “)}
O “$0” indica que a função “split” vai ler o registro inteiro (as 4 linhas) e armazená-lo na matriz “a”. O separador dos campos do registro é o “: “. Assim, será gerada uma matriz de 4 linhas e 2 colunas. Na 1ª coluna estarão os valores que estão antes do separador e na 2ª coluna os valores que estão depois.
2ª parte: /^uid/{uid=a[2]} /^cn/{cn=a[2]} /^department/{dep=a[2]; print uid, cn, dep}
/^uid/{uid=a[2]} -> pesquisa no registro o campo que começa com a string “uid” e atribui a variável “uid” o valor da segunda coluna correspondente no array. No exemplo, a variável “uid” recebe o valor FDTAL. O mesmo será feito para os demais campos (“cn” e “department”).
Por fim, é feito o print das variáveis (“uid”, “cn” e “dep”), na saída padrão ou redirecionando para um arquivo, se desejar.
Referências: