Я пытаюсь "привязать" привязку для конкретного пользователя из файла журнала LDAP. Строки, которые мне нужны, будут распределены по нескольким строкам в журнале. Вот пример ввода:
[2009/04/28 17:04:42.414] DoBind on connection 0x7c8affc0
[2009/04/28 17:04:42.414] Bind name:cn=admin,ou=appids,o=admineq, version:3, authentication:simple
[2009/04/28 17:04:42.415] Failed to authenticate local on connection 0x6cc8ee80, err = log account expired (-220)
[2009/04/28 17:04:42.416] Sending operation result 53:"":"NDS error: log account expired (-220)" to connection 0x6cc8ee80
[2009/04/28 17:04:42.416] Operation 0x3:0x60 on connection 0x6cc8ee80 completed in 3 seconds
[2009/04/28 17:04:42.416] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:42.416] Operation 0x1:0x60 on connection 0x7c8affc0 completed in 0 seconds
[2009/04/28 17:04:48.772] DoSearch on connection 0x7c8affc0
[2009/04/28 17:04:48.772] Search request:
base: "o=intranet"
scope:2 dereference:0 sizelimit:0 timelimit:600 attrsonly:0
filter: "(guid='03ADmin)"
attribute: "cn"
attribute: "cn"
attribute: "cn"
attribute: "cn"
attribute: "objectClass"
attribute: "guid"
attribute: "mail"
[2009/04/28 17:04:48.773] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:48.773] Operation 0xe851:0x63 on connection 0x7c8affc0 completed in 0 seconds
Для этого примера результатом должно быть следующее:
[2009/04/28 17:04:42.414] DoBind on connection 0x7c8affc0
[2009/04/28 17:04:42.414] Bind name:cn=admin,ou=appids,o=admineq, version:3, authentication:simple
[2009/04/28 17:04:42.416] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:42.416] Operation 0x1:0x60 on connection 0x7c8affc0 completed in 0 seconds
По сути, это журнал операций сервера по нескольким соединениям. Мне нужно проанализировать время, затрачиваемое на операции «связывания» пользователем-администратором, но этот сервер очень занят, поэтому мне нужно устранить много шума.
В псевдокоде:
for each line in file
if line contains "DoBind" and next line contains "cn=admin"
print both lines
find the connection number X in lines
skip lines until "Sending operation result.*to connection X" is found
print two lines
Я хотел бы получить строки «DoBind», которым предшествует пользователь «cn = admin», а затем строки результата, которые перечислены в соответствии с номером соединения «0x7c8affc0» в этом примере. Между началом и концом связывания, которые мне не нужны, могут выполняться другие операции, такие как сообщение «Не удалось аутентифицировать», которое происходит в другом соединении.
Кроме того, после выполнения привязки будут выполняться другие операции с подключением, в которых я не заинтересован. В приведенном выше примере операции DoSearch, происходящие после привязки, не должны регистрироваться.
Я пытаюсь сделать это с помощью «sed», который выглядел как правильный инструмент для работы. Увы, однако, я новичок, и это опыт обучения. Вот что у меня есть:
/.*DoBind on connection \(0x[0-9a-f]*\)\n.*Bind name:cn=OblixAppId.*/ p
/.*Sending operation result.*to connection \1\nOperation.*on connection \1 completed.*/ p
sed жалуется на вторую строку, где я использую '\ 1'. Я пытаюсь захватить адрес подключения и использовать его в последующем поиске, чтобы захватить строки результата, но я, очевидно, неправильно его использую. Переменные '#' кажутся локальными для каждой операции поиска.
Есть ли способ передачи "переменных" из одного поиска в другой, или я должен вместо этого изучать Perl?