Grep
Grep - 匹配後返回不同行大小的內容
我需要找到一種
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 行以正常工作。