Grep

Grep - 匹配後返回不同行大小的內容

  • January 16, 2020

我需要找到一種grep在匹配後返回不同行大小的內容的方法。有些比賽后面有 4 行,其他有 20 行。我需要它們。

每小時我都希望返回前一小時的日誌條目,其時間戳如下:

time: 20200115132443

為此,我想每隔一小時,一個 cronjob 都會將前一小時的時間戳作為 grep 語句執行:

grep "time: 2020011507"

我遇到的問題是比賽后某些條目的日誌大小不同,所以像這樣的事情grep -C 5不會一直有效。

我想知道我是否應該將匹配的所有內容返回到下一個匹配的 grep 語句(這將錯過最後一個條目),或者是否有其他方式來執行它。範例日誌文件片段如下所示:

time: 20200115132443
logging stuffs
time: 20200115134543
more logging 
stuffs 
like this
time: 20200115140201 # this should now not be returned

也許我過於復雜,可以只執行grep目前小時的語句,然後在該小時之前和前一小時之後獲取所有內容。

可能的方法:

# variable S0 - date string for hour ago
S0="time: $(date -d '1 hour ago' +%Y%m%d%H)"
# Variable S1 - date string for current hour
S1="time: $(date +%Y%m%d%H)"
# taking lines from between two just defined strings
# including first and excluding second date string
# from file /var/log/log.log
sed -n "/^${S0}/,/^${S1}/ {/^${S1}/"'!p};' /var/log/log.log

現在試圖使它成為一個緊湊的單班輪:

sed -n "/^time: $(date -d '1 hour ago' +%Y%m%d%H)/,/^time: $(date +%Y%m%d%H)/ {/^time: $(date +%Y%m%d%H)/"'!p}' /var/log/log.log

您可以將輸出重定向到臨時文件並使用它。

或者你可以簡單地在一個襯裡的末端添加一個管道和 grep:

|grep "mystring"

.

PS根據作業系統,命令日期格式可能會有所不同。

  • 我們在這裡使用的 Linux:date -d ‘1 hour ago’ +%Y%m%d%H
  • 我們可以使用的 Linux:date -d @ $ (( $ (日期 +%s)-3600)) +%Y%m%d%H
  • MacOS X:日期-r $ (( $ (日期 +%s)-3600)) +%Y%m%d%H

等等

***更新:***發現刪除最後找到的行的 sed 部分 ‘$d’ 不起作用,因此更新了 sed 行以正常工作。

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