linuxgrep时间排序,关于排序:Linuxgrep和排序⽇志⽂件我⼏乎到处都没有运⽓,看上去(那⾥,那⾥,那⾥,那⾥和那⾥)。sort命令排序
我在这⾥拥有的是⽬录中的⼀堆⽇志⽂件,我需要在其中查特定的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命令输出⽂件名,后跟":",我想根据该字符对结果进⾏排序。
⾮常感谢
您的⽇期中包含冒号,并且排序字段基于1。 尝试-k2
好的,我必须删除-n选项。 最终命令是:grep -ri --color = always" myID" | 排序-k2
尝试这个:
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}
它仍然具有-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) 。
您可以使⽤:
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
另⼀个解决⽅案,时间更长⼀点,但我认为它应该起作⽤:
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论