#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
Ответ №3:
egrep
использует расширенное регулярное выражение (эквивалентно grep -E
). Вместо этого предпочитайте grep -P
(регулярное выражение perl).
-z
Флаг делает ваше регулярное выражение многострочным:
grep -Pz "dn(n|.)*?(nn|$)"
Это совпадает с dn
последующим любым количеством символов (или новой строкой) до тех пор, пока ( ?
не сделает предыдущее выражение ленивым, а не жадным) следующее вхождение nn
или конец файла ( $
)