簡體   English   中英

Linux grep 並對日志文件進行排序

[英]Linux grep and sort log files

我幾乎無處不在( 那里那里那里那里那里),但沒有運氣。

我這里有一個目錄中的一堆日志文件,我需要在其中查找特定的 ID (myID) 並按日期對 output 進行排序。 這是一個例子:

在 file1.log 中:

2015-09-26 15:39:50,788 - DEBUG - blabla : {'id' : myID}

在 file2.log 中:

2015-09-26 15:39:51,788 - ERROR - foo : {'id' : myID}

在 file3.log 中:

2015-09-26 15:39:48,788 - ERROR - bar : {'id' : myID}

預計 output:

2015-09-26 15:39:48,788 - ERROR - bar : {'id' : myID}
2015-09-26 15:39:50,788 - DEBUG - blabla : {'id' : myID}
2015-09-26 15:39:51,788 - ERROR - foo : {'id' : myID}

我現在正在做的(而且效果很好)是:

grep -hri --color=always "myID" | sort -n

唯一的問題是使用 grep 的 -h 選項,文件名被隱藏了。 我想保留文件名並保持排序。 我試過了:

grep -ri --color=always "myID" | sort -n -t ":" -k1,1 -k2,2

但它不起作用。 基本上,grep 命令輸出文件名后跟“:”,我想從這個字符對結果進行排序。

非常感謝

嘗試這個:

grep --color=always "myID" file*.log | sort -t : -k2,2 -k3,3n -k4,4n

輸出:

file3.log:2015-09-26 15:39:48,788 - ERROR - bar : {'id' : myID}
file1.log:2015-09-26 15:39:50,788 - DEBUG - blabla : {'id' : myID}
file2.log:2015-09-26 15:39:51,788 - ERROR - foo : {'id' : myID}

另一個解決方案,稍微長一點,但我認為它應該工作:

 grep -l "myID" file* > /tmp/file_names && grep -hri "myID" file* | sort -n > /tmp/grep_result && paste /tmp/file_names /tmp/grep_result | column -s $'\t' -t

它的作用基本上是,首先通過以下方式存儲文件名:

grep -l "myID" file* > /tmp/file_names

存儲grep排序結果:

grep -hri "myID" file* | sort -n > /tmp/grep_result 

逐列粘貼結果(使用制表符分隔符):

paste /tmp/file_names /tmp/grep_result | column -s $'\t' -t

排序的列排序是從1開始的,因此k1將是您的文件名部分。 這意味着在您的嘗試中,您按文件名排序,然后按日志行的日期和小時排序。 此外, -n表示您正在使用數字排序,它不能與yyyy-mm-dd hh:mm:ss格式很好地匹配(它將只讀取yyyy-mm-dd hh作為第一個數字,即年)。

您可以使用:

sort -t ":" -k2

請注意,我將第2列指定為開頭,並將結尾留空。 結束默認為行尾。

如果要對特定列進行排序,則需要顯式設置開始結束,例如: -k2,2 您可以使用它來對無序列進行排序,例如-k4,4 -k2,2將按列4排序,並使用第2列進行打破平局。

您也可以使用-k2,4 ,它會在您的日志詳細信息之前停止在冒號處排序(即它將使用2015-09-26 15:39:48,788 - ERROR - bar

最后,如果時間相同,也許您希望將日志文件保持一致的順序:

sort -t ":" -k2,4 -k1,1

試用基於 Rust 的工具Super Speedy Syslog Searcher

(假設您安裝了rust

cargo install super_speedy_syslog_searcher

然后

s4 file1.log file2.log file3.log | grep "myID"

唯一的問題是使用 grep 的 -h 選項,文件名被隱藏了。 我想保留文件名並保持排序。

你可以試試

$ s4 --color=never -nw file1.log file2.log file3.log | grep "myID"
file1.log:2015-09-26 15:39:48,788 - ERROR - bar : {'id' : myID}
file2.log:2015-09-26 15:39:50,788 - DEBUG - blabla : {'id' : myID}
file3.log:2015-09-26 15:39:51,788 - ERROR - foo : {'id' : myID}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM