вывод таблицы в формате ldapsearch в файл awk - PullRequest
0 голосов
/ 05 декабря 2018

Я извлекаю из LDAP всех пользователей kerberos (но только некоторые их переменные, например, kerberosid, location, mail, name, фамилию, ...) в плоский файл (разделитель - конвейер).

Я пыталсяиспользовать синтаксис LDAP из LDAPSEARCH в табличный формат , но я имею в виду смешанные значения, которые я имею в виду (я вижу, например, то же имя в следующей строке, но следующая строка в файле начинается со второй записи LDAP и т. д.)Производительность важна.

Я бы предпочел иметь даже пустую строку в позиции, где значение отсутствует.Я не уверен, что это не происходит, потому что в некоторых предыдущих записях отсутствует целый индекс (переменная, например, mail), и с этой позиции все сдвигается ...

Блок кода по ссылке:

$ ldapsearch -x -D "cn=something" | awk -v OFS=',' '{split($0,a,": ")} /^mail:/{mail=a[2]} /^uidNumber:/{uidNumber=a[2]} /^uid:/{uid=a[2]} /^cn/{cn=a[2]; print uid, uidNumber,cn , mail}' > ldap_dump.csv

Результат поиска Ldap:

dn: xxxxx 
objectClass: top 
mail: 11111
uidNumber: 222 222 
uid: 333, 3333 
cn: 44444 
somethingnext: 5555

dn: new records 
objectClass: top 
mail: aaaaa 
uidNumber: bbbbb 
uid: cccc, cccc 
cn: ddddd 
somethingnext: eeeee

каждая строка находится на новой строке, а между записями пустая новая строка

Needed output in a file should be : 
11111|222 222|333, 3333|44444
aaaaa|bbbbb|cccc, cccc|ddddd

1 Ответ

0 голосов
/ 05 декабря 2018

Используйте следующее awk:

awk 'BEGIN{RS=""; OFS="|"}
     { mail = cn = uidNumber = uid = ""
       for(i=1;i<=NF;++i) {
          if ($i ~ /^mail:/) { mail=substr($i,7) }
          else if ($i ~ /^uidNumber:/) { uidNumber=substr($i,12) }
          else if ($i ~ /^uid:/      ) { uid=substr($i,6) }
          else if ($i ~ /^cn:/       ) { cn=substr($i,5) }
       }
       print mail,uidNumber,uid,cn
     }'

Исправленная версия вашей исходной версии:

awk 'BEGIN{FS=": *"; OFS="|"}
     (NF==0) { print uid,uidNumber,cn,mail }
     (NF==0) { mail = uidNumber = uid = cn = ""; next }
     {split($0,a,": ")}
     /^mail:/{mail=a[2]}
     /^uidNumber:/{uidNumber=a[2]}
     /^uid:/{uid=a[2]}
     /^cn/{cn=a[2]}
     END{ print uid,uidNumber,cn,mail }'
...