Назад | Перейти на главную страницу

Управление многострочным списком данных (файл ldif) с помощью awk или другого инструмента

Я пытаюсь манипулировать файлом ldif с несколькими записями. Моя цель - проанализировать этот существующий файл ldif, извлечь атрибуты «givenName» и «sn», чтобы создать атрибут «mail». Я думал об AWK или Sed, но, к сожалению, я не эксперт в этих двух хороших инструментах. Пример:

исходный файл

dn: cn=fremer, ou=people, dn=domain, dn=com
cn: fremer
givenName: Freddy
sn: Mercury

dn: cn=markno, ou=people, dn=domain, dn=com
cn: markno
givenName: Mark
sn: Knopfler

Вывод:

dn: cn=fremer, ou=people, dn=domain, dn=com
mail: freddy.mercury@domain.com

dn: cn=markno, ou=people, dn=domain, dn=com
mail: mark.knopfler@domain.com

DNS нужен, так как я возьму полученный ldif и передам его ldapadd для обновления LDAP. Любое предложение или подсказка о том, где мне смотреть? Спасибо!

Вы можете сделать это с помощью сценария awk

#!/bin/awk -f
/^dn:/ {split($0,dname,", dn=");print $0 }
/^cn:/ { cn = $2 }
/^givenName:/ { gn = tolower($2) }
/sn:/ { sn = tolower($2) ; printf("mail: %s.%s@%s.%s\n\n",gn,sn,dname[2],dname[3] ) }

для использования сохраните вышеуказанное в файле, например awkscript и сделайте его исполняемым, затем

./awkscript datafile

Учитывая ваш ввод, этот сценарий выводит

dn: cn=fremer, ou=people, dn=domain, dn=com
mail: freddy.mercury@domain.com

dn: cn=markno, ou=people, dn=domain, dn=com
mail: mark.knopfler@domain.com

Что касается многострочных вещей, я всегда прибегаю к Perl или чему-то еще, что позволяет мне писать фактические структуры данных в получитаемом виде. Вы действительно можете написать читаемый код Perl; Мне никогда не удавалось прочитать команду awk, если она превышает пару десятков символов. Я вовсе не говорю, что это невозможно; Я просто не знаю, как это сделать.

Дополнительным преимуществом Perl является то, что вы можете найти (или уже имеете) модуль LDAP / LDIF, так что вам не придется разбирать его самостоятельно. Потенциальным недостатком Perl является необходимость выбора одного из этих модулей. Как правило, лучше всего будет начинать все, что имеет в названии слово «Простой».