Регулярное выражение: Получить многострочную запись LDAP

#regex #grep #ldap

Вопрос:

Я пытаюсь захватить всю запись LDAP с dn:. последней строки записи, но останавливаюсь на последней строке перед следующей записью, например, n#идентификатор записи: 8266. Мое использование методом проб и ошибок egrep абсолютно ни к чему не приводит. ПРИМЕЧАНИЕ: Я использую экспортированные файлы ldif, в которых хранятся данные, fwiw.

Ближе всего я подошел к egrep "dn: cn=name,ou=People,dc=example,dc=com. .|n*. n" терминалу, но без вывода. Я проверил фактическое регулярное выражение на regexr.com. Я понимаю, что это совершенно другое зависть.

Заранее спасибо!


Примеры Данных:

 
dn: cn=name,ou=People,dc=example,dc=com 
shadowLastChange: 17492 
userPassword: password 
sn: Last 
givenName: First 
cn: first 
mail: name@example.com 
displayName: First Last 
o: University 
ou: Dept. 
objectClass: top 
objectClass: person

# entry-id: 8266
 

Комментарии:

1. В записях LDAP нет строк. Поэтому такой вещи, как многострочная запись LDAP, не существует. На самом деле вы говорите о представлении LDIF записи LDAP. Но приведенный вами пример логически состоит только из одной строки из-за обратной косой черты, убегающей от терминатора строки.

Ответ №1:

С показанными вами образцами, пожалуйста, попробуйте выполнить следующий awk код.

 awk '/entry-id/{found=""} /^dn:/{found=1} found' Input_file
 

ИЛИ в случае, если вы хотите распечатать только 1 комплект из dn: предыдущего entry-id: , попробуйте выполнить следующий код:

 awk '/entry-id/{exit} /^dn:/{found=1} found' Input_file
 

Ответ №2:

Если данные всегда структурированы таким образом, и использование awk является опцией, вы можете использовать диапазон, начинающийся с dn: и заканчивающийся entry-id: , и печатать только строки, у которых нет идентификатора записи:

 awk '/^dn:/,/entry-id/ {
  if(!/entry-id:/){print}
}' file
 

Демо-версия Awk

Ответ №3:

egrep использует расширенное регулярное выражение (эквивалентно grep -E ). Вместо этого предпочитайте grep -P (регулярное выражение perl).
-z Флаг делает ваше регулярное выражение многострочным:

 grep -Pz "dn(n|.)*?(nn|$)"
 

Это совпадает с dn последующим любым количеством символов (или новой строкой) до тех пор, пока ( ? не сделает предыдущее выражение ленивым, а не жадным) следующее вхождение nn или конец файла ( $ )