mar*_*kus 13 linux bash shell logging command-line
我有一个日志文件,其条目如下:
...    
freeswitch.log:2011-09-08 12:21:07.282236 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3525c0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
freeswitch.log:2011-08-08 13:21:07.514261 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda354460 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
freeswitch.log:2011-06-04 16:21:08.998227 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda356300 in queue 0x7f2ce8005990, no more room! windex == rindex == 58! 
freeswitch.log:2011-09-08 12:21:10.374238 [ERR] ftdm_queue.c:136 Failed to enqueue obj 0x7f2cda3581a0 in queue 0x7f2ce8005990, no more room! windex == rindex == 58!
...
如何通过每行中的时间戳降序使用linux命令行工具对文件进行排序?
Stu*_*ley 17
使用排序的--stable,--reverse和--key选项:
sort --stable --reverse --key=1,2 freeswitch.log
(对于非教学目的,这可以缩短为-srk1,2.)
该sort命令(如您所料)按排序顺序输出命名文件(或STDIN)的每一行.每个选项的作用如下:
--reverse选项告诉您sort将具有更高值(更晚的日期)的行排序更高,而不是更低.根据其他答案,假设这是"降序"的意思(即使这种排序通常被认为是"升序").如果要按时间顺序对行进行排序,则省略此选项.--key=1,2选项告诉sort我只使用前两个以空格分隔的"字段"("freeswitch.log:" - 前缀日期和时间)作为排序键.指定要使用的最后一个字段很重要,即使您只按一个字段排序(例如,如果每行在ISO-8601标准字段中将时间和日期保持在一起,就像freeswitch.log 2011-09-08T12:21:07.282236您要使用的那样-k 2,2),as,by默认情况下,键使用的字段会扩展到行尾.--stable选项告诉sort不执行"最后的订购".如果没有此选项,--keys则会根据整行对具有两个相等键(由选项指定)的行进行排序,这意味着文件名和/或内容将更改行的排序顺序.指定两个范围--key以及--stable选项很重要.没有它们,同时发生的多行输出(换句话说,多行消息)将根据消息的内容(没有第二个字段--key)和/或文件名进行排序(--stable如果没有,如果没有,文件名是一个单独的字段,如下所述).
换句话说,这样的日志消息:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238    My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238               ^
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238   did you forget to
freeswitch.log:2011-09-08 12:21:10.374238   close your brackets?
会被"分类"成:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238               ^
freeswitch.log:2011-09-08 12:21:10.374238   close your brackets?
freeswitch.log:2011-09-08 12:21:10.374238   did you forget to
freeswitch.log:2011-09-08 12:21:10.374238    My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
这是"排序"(因为"c"在"d"之前,"S"在"W"之前),但它不是有序的.指定--stable(并保持--key有界)将跳过额外的排序并保留订单,这正是您想要的.
此外,只有输出中的每一行都以相同的文件名开头,才能按此组合的文件名和日期字段进行排序.根据您发布的语法,如果您的输入有多个不同的文件名,您希望在排序时忽略这些文件名,则需要使用一个程序,例如sed将文件名转换为自己的空格分隔字段,然后将转换后的行管道传输到sort(之后)然后你可以转换字段分隔符):
sed 's/:/ /' freeswitch.log | sort -srk2,3 | sed 's/ /:/'
请注意,键使用的字段将更改为2,3,跳过第一个(文件名)字段.
gpo*_*ojd 13
使用sort的-k标志:
sort -k1 -r freeswitch.log
这将通过第一个键对文件进行反向排序(即freeswitch.log:2011-09-08 12:21:07.282236).如果文件名始终相同(freeswitch.log),则应按日期排序.