Я пытаюсь манипулировать файлом 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 является необходимость выбора одного из этих модулей. Как правило, лучше всего будет начинать все, что имеет в названии слово «Простой».