关于排序:Linux grep和排序日志文件 您所在的位置:网站首页 shell对文件内容排序 关于排序:Linux grep和排序日志文件

关于排序:Linux grep和排序日志文件

2023-10-04 11:15| 来源: 网络整理| 查看: 265

我几乎到处都没有运气,看上去(那里,那里,那里,那里和那里)。

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

在file1.log中:

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

在file2.log中:

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

在file3.log中:

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

预期输出:

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

我现在正在做的(并且效果很好)是:

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

唯一的问题是,使用grep的-h选项时,文件名被隐藏。 我想保留文件名并保持排序。 我试过了 :

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

但这是行不通的。 基本上,grep命令输出文件名,后跟":",我想根据该字符对结果进行排序。

非常感谢

相关讨论 您的日期中包含冒号,并且排序字段基于1。 尝试-k2 好的,我必须删除-n选项。 最终命令是:grep -ri --color = always" myID" | 排序-k2

尝试这个:

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

输出:

123file3.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} 相关讨论 它仍然具有-n,这意味着yyyy-mm-dd hh列将忽略年份之后的所有内容。 如果您解决此问题,由于-k2使用的是2-to-end列,而不仅仅是2列,因此-k3 -k4变得多余。 谢谢。 香港专业教育学院更新了我的答案。 @Cyrus出于某种原因,当我将输出重定向到文件时,它到处都会产生不需要的字符,即:^ [[m ^ [[K ^ [[36m ^ [[K:^ [[m ^ [[KJul 14 15 :57:47而不是这样:Jul 14 15:57:47 @vaibhavkumar:您的文件似乎包含特殊字符。 检查文件:cat -A file或cat -v file。

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

您可以使用:

1sort -t":" -k2

请注意,我将第2列指定为开始,而将结束留为空白。末尾默认为行尾。

如果要对特定列进行排序,则需要显式设置开始和结束,例如:-k2,2。您可以使用它来对乱序列进行排序,例如-k4,4 -k2,2将按列4进行排序,并使用列2进行平局。

您还可以使用-k2,4,它将在您的日志详细信息之前在冒号处停止排序(即它将使用2015-09-26 15:39:48,788 - ERROR - bar)

最后,如果时间相同,也许您希望日志文件的顺序一致:

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

另一个解决方案,时间更长一点,但我认为它应该起作用:

1 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

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

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

存储grep排序结果:

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

逐列粘贴结果(使用制表符分隔符):

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有