設定sed指令參數的時間範圍

設定sed指令參數的時間範圍

這是我的範例日誌文件,我喜歡從一個非常大的日誌文件中提取出來

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:3623:11:34失敗sed了。我已經進行了測試grepawk但對預期結果沒有希望。它只給我發生的日誌,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)目前行不再與該模式相符。

相關內容