我正在尝试从 LDAP 日志文件中为特定用户“grep”绑定。我需要的行将分布在日志中的多行中。这是示例输入:
[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
我想获取用户“cn=admin”之前的“DoBind”行,然后是结果行,在本例中根据连接号“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 吗?