Command-Line

將 mtime 添加到 grep -c 輸出並按 mtime 對輸出進行排序

  • April 2, 2016

我有一個目錄,其中包含以下樣式的日誌:

info.log00001
info.log00002
info.log00003
...
info.log09999
info.log

我目前的輸出(使用 grep -c)

我需要分析偶爾發生的特定錯誤的頻率,因此請轉到該目錄並使用grep -crw . -e "FooException BarError" | sort -n | less獲取以下內容:

./info.log00001: 1
./info.log00002: 0
./info.log00003: 42
...
./info.log09999: 25
./info.log: 0

然後,我可以ls -lt查看它們的修改日期並分析錯誤發生最多的時間。

我想要的輸出(帶有計數和日期)

無論如何,我想找到一種方法來獲得計數和日期在同一行中的輸出。這將使我的分析更容易。我想要一些東西:

2015-09-31 10:00 ./info.log00001: 1
2015-09-31 10:15 ./info.log00002: 0
2015-09-31 10:30 ./info.log00003: 42
...
2016-04-01 13:20 ./info.log09999: 25
2015-09-31 13:27 ./info.log: 0

附加資訊

理想情況下,我只想使用一個命令來完成此操作,但首先將grep’ 的輸出扔到文件中,然後處理該文件也可以。

另外,我真的不關心日期格式或日期是在行尾還是行首。我只想讓文件按日期排序,從最舊的開始(這也是其名稱中編號最小的文件)

我找到了一種方法來完成與 類似的事情awk,但在我的情況下它不起作用,因為它從grep’ 的輸出中解析文件名,在我的情況下,grep’ 的輸出具有更多的文本,而不僅僅是文件的路徑。

我非常感謝對此的任何回饋。

如果你有gnu find- 並且假設你的文件名都不包含換行符 - 你可以使用find’s-printfmtime所需的格式輸出 + 文件名,然後執行grep以獲取計數:

find . -type f -printf '%TY-%Tm-%Td %TH:%TM %p: ' -exec grep -cw "whatever" {} \; | sort -k1,1 -k2,2

或者,zsh您可以使用 glob 並按修改時間排序(通過glob 限定符-.選擇正常文件,按mtimeOm降序排序),然後為每個文件列印使用模組、文件名,然後再次通過:mtimestatgrep

zmodload zsh/stat
for f in ./**/*(.Om)
do
printf '%s %s\t%s %s: ' $(zstat -F '%Y-%b-%d %H:%M' +mtime -- $f) $f
grep -cw "whatever"  $f
done

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