Sed
如果不滿足最後一個模式,則 Sed 範圍問題
我正在使用 sed 進行範圍搜尋。我想將日誌數據從日期和時間解析
2016-09-29 01:00
為2016-09-29 01:30
. 這就是為什麼我一直在使用以下命令,$ sed -n '/2016-09-29 01:/,/2016-09-29 01:30:.*$/p'
但問題是如果 1:30 在日誌中不可用,那麼它將所有日誌返回到最後。
那麼如何使用它,以便如果
1:30
不存在它將轉到下一個記錄直到結束。需要考慮的事項:日誌包含堆棧跟踪,因此包含堆棧跟踪的行不以日期開頭。
沒那麼奇怪。
sed
是一個流水線編輯器**,**它線上路出現時對其進行處理。範圍 like/a/,/b/
表示一旦a
找到就選擇行,找到後不再選擇b
。如果b
從未找到,它永遠不會停止選擇行。在這裡,您應該
awk
改為使用。假設這些時間戳位於行首:awk '$0 >= "2016-09-29 01:" && $0 < "2016-09-29 01:30"'
請注意,它只會選擇在該範圍內具有時間戳的行,因此會排除沒有時間戳的行,即使它們位於該範圍內具有時間戳的行之間。
另一種解決方法是:
awk -v start='2016-09-29 01:' -v end='2016-09-29 01:30' ' $0 >= start && $0 <= end, /^[0-9]{4}([ :-][0-9]{2}){5}/ && $0 >= end'
即使用類似 in 的範圍
sed
,但在第一行輸入兩個日期之間的範圍,並且僅當我們找到時間戳大於結束日期的行時才保留它。