Sed

如果不滿足最後一個模式,則 Sed 範圍問題

  • August 29, 2018

我正在使用 sed 進行範圍搜尋。我想將日誌數據從日期和時間解析2016-09-29 01:002016-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,但在第一行輸入兩個日期之間的範圍,並且僅當我們找到時間戳大於結束日期的行時才保留它。

引用自:https://unix.stackexchange.com/questions/465477