2015-09-27 129 views
1

我看起来几乎无处不在(there,there,there,therethere)没有运气。Linux grep和排序日志文件

我在这里有一堆目录中的日志文件,我需要查找特定的ID(myID)并按日期对输出进行排序。下面是一个例子:

在file1.log

在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} 

Exepected输出:

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

非常感谢

+2

您的日期在其中有冒号,并且排序的字段为1。尝试'-k2' – Dave

+0

好吧,我必须删除-n选项。 最后的命令是:grep -ri --color = always“myID”| sort -k2 – justinlevol

回答

1

试试这个:

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} 
+0

这仍然有'-n'这意味着'yyyy-mm-dd hh'列将在一年后忽略所有内容。如果你解决这个问题,'-k3 -k4'变得多余,因为'-k2'使用2到2列,而不仅仅是2 – Dave

+0

谢谢。我已经更新了我的答案。 – Cyrus

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 
0

列排序因为排序是基于1的,所以k1将是你的文件名部分。这意味着在你的尝试中,你按照文件名进行排序,然后按日志行的日期和时间进行排序。此外,-n意味着您正在使用数字排序,这将不会与yyyy-mm-dd hh:mm:ss格式一起播放(它将只读取yyyy-mm-dd hh作为第一个数字,即年份)。

您可以使用:我指定列2作为开始,并留下末尾的空白

sort -t ":" -k2 

注意。结尾默认为行结束。

如果要对特定列进行排序,则需要明确设置开始结束,例如:-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