这里有一堆目录中的日志文件,需要查找特定的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}在file3.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命令输出文件名,后面跟着":",我想对这个字符的结果进行排序。
非常感谢
发布于 2015-09-27 09:32:27
另一种解决办法,稍长一点,但我认为它应该有效:
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发布于 2015-09-27 10:18:02
排序的列排序是基于1的,因此k1将是您的文件名部分。这意味着在尝试中,您正在按文件名进行排序,然后按日志行的日期和时间进行排序。另外,-n意味着您使用的是数字排序,它不会很好地处理yyyy: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发布于 2022-10-10 23:33:20
尝试基于锈蚀的工具https://crates.io/crates/super_speedy_syslog_searcher
(假设你有锈蚀装置)
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}https://stackoverflow.com/questions/32805939
复制相似问题