Linux grep和排序日志文件

时间:2015-09-27 08:17:52

标签: linux sorting logging grep

我几乎无处不在(theretheretheretherethere),但没有运气。

我在这里有一堆目录中的日志文件,我需要查找特定的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}
文件3.log中的

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

预期输出:

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命令输出文件的名称,后跟":",我想对此字符的结果进行排序。

非常感谢

3 个答案:

答案 0 :(得分:3)

试试这个:

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}

答案 1 :(得分:0)

另一个解决方案,稍微长一点,但我认为它应该有效:

 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

答案 2 :(得分:0)

排序的列排序是从1开始的,因此k1将是您的文件名部分。这意味着在您的尝试中,您按文件名排序,然后按日志行的日期和小时排序。此外,-n表示您正在使用数字排序,它不能与yyyy-mm-dd hh:mm:ss格式很好地匹配(它将只读取yyyy-mm-dd hh作为第一个数字,即年份。

您可以使用:

sort -t ":" -k2

请注意,我将第2列指定为开头,并将结尾留空。结束默认为行尾。

如果要对特定列进行排序,则需要显式设置start end,例如:-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