这是我的示例日志文件,我喜欢从一个非常大的日志文件中提取出来
2017-05-30 23:11:34,629 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking auth agent [accountName=rene1 remoteAddress=STEDGE/172.16.8.3]
2017-05-30 23:11:14,638 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - SSH: Failed login attempt on [172.16.8.1]. Username: "rene1".
2017-05-30 23:10:54,663 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.KeyboardInteractiveAuthentication - SSH: Sent SSH_MSG_USERAUTH_INFO_REQUEST (Password Authentication):
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - User login attempt has been made from address /172.16.8.1:58222
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking config agent [accountName=rene1 remoteAddress=/172.16.8.1]
2017-05-30 23:10:36,446 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Config agent success [accountName=rene1 remoteAddress=/172.16.8.1]
我想使用 提取整个日志块,23:10:36
但23:11:34
失败sed
了。我已经测试过grep
,awk
但对预期结果没有希望。它只给我发生的日志,23:10:36
这不是我预期的结果。这是我的命令
sed -n '/23:10:36/,/23:11:34/p' stlog.txt
有人知道如何让它发挥作用吗?它只包含没有日期的时间,因为我的程序将仅获取当前系统时间并仅根据当前系统时间查询日志。
答案1
我在这里可以看到两个问题:1)日志似乎是相反的顺序,2)您有多行与“结束”模式匹配。
(尽管最后一行的 23:10:36,446 晚于倒数第二行的 23:10:36,415)
使用相反的顺序,您只会得到匹配的行,23:10:36
因为sed
当它看到 时开始打印,并继续直到它看到23:11:34
,而它不存在。
反转模式(如下所示)似乎是一个解决方案,但您仍然只能得到与结束模式匹配的第一行,因为第一次看到该模式时打印会停止。
sed -n '/23:11:34/,/23:10:36/p' stlog.txt
这是一个awk
应该能够解决该问题的解决方案:
awk -vstart="23:11:34" -vend="23:10:36" \
'$0 ~ start {p=1} $0 ~ end {e=1} e && $0 !~ end {p=0} p' stlog.txt
该变量p
控制打印,并且仅在看到“结束”模式后才被清除(e
为 1)和当前行不再与该模式匹配。