首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux grep和排序日志文件

Linux grep和排序日志文件
EN

Stack Overflow用户
提问于 2015-09-27 08:17:52
回答 3查看 6.8K关注 0票数 3

我几乎到处找(那里那里那里那里那里),没有运气。

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

在file1.log中:

代码语言:javascript
复制
2015-09-26 15:39:50,788 - DEBUG - blabla : {'id' : myID}

在file2.log中:

代码语言:javascript
复制
2015-09-26 15:39:51,788 - ERROR - foo : {'id' : myID}

在file3.log中:

代码语言:javascript
复制
2015-09-26 15:39:48,788 - ERROR - bar : {'id' : myID}

出口产出:

代码语言:javascript
复制
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}

我现在所做的(而且效果很好)是:

代码语言:javascript
复制
grep -hri --color=always "myID" | sort -n

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

代码语言:javascript
复制
grep -ri --color=always "myID" | sort -n -t ":" -k1,1 -k2,2

但不起作用。基本上,grep命令输出文件名,后面跟着":",我想对这个字符的结果进行排序。

非常感谢

EN

回答 3

Stack Overflow用户

发布于 2015-09-27 09:32:27

另一种解决办法,稍长一点,但我认为它应该有效:

代码语言:javascript
复制
 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

它所做的基本工作是,第一个存储文件的名称是:

代码语言:javascript
复制
grep -l "myID" file* > /tmp/file_names

存储grep排序结果:

代码语言:javascript
复制
grep -hri "myID" file* | sort -n > /tmp/grep_result 

按列粘贴结果(使用选项卡分隔符):

代码语言:javascript
复制
paste /tmp/file_names /tmp/grep_result | column -s $'\t' -t
票数 0
EN

Stack Overflow用户

发布于 2015-09-27 10:18:02

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

您可以使用:

代码语言:javascript
复制
sort -t ":" -k2

请注意,我将第2列指定为开始,并将末尾保留为空。末端默认为行尾.

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

您还可以使用-k2,4,它将停止在日志详细信息之前对冒号进行排序(也就是说,它将使用2015-09-26 15:39:48,788 - ERROR - bar)。

最后,如果时间相同,您可能希望日志文件保持一致的顺序:

代码语言:javascript
复制
sort -t ":" -k2,4 -k1,1
票数 0
EN

Stack Overflow用户

发布于 2022-10-10 23:33:20

尝试基于锈蚀的工具https://crates.io/crates/super_speedy_syslog_searcher

(假设你有锈蚀装置)

代码语言:javascript
复制
cargo install super_speedy_syslog_searcher

然后

代码语言:javascript
复制
s4 file1.log file2.log file3.log | grep "myID"

唯一的问题是,使用grep的-h选项,文件名是隐藏的。我想保留文件名和排序。

你可以试试

代码语言:javascript
复制
$ 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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32805939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档