在Emacs中按时间戳对行进行排序

时间:2018-07-11 14:47:45

标签: emacs

我有一个日志文件,该文件由多个线程编写,因此顺序不正确。 日志中包含以下条目:

[2018-07-11 15:30:39.139] [ddm.iolib.InputWorker] [debug] pop cmd from in queue...

[2018-07-11 15:30:39.140] [ddm.iolib.InputWorker] [debug] push cmd to out queue...

我想按时间戳对行进行排序。 我发现了对bash排序的好答案:sort logfile by timestamp

这工作正常,但我想在Emacs中对其进行排序。我尝试使用sort-regexp-fields,但似乎我不够聪明,无法使其正常工作。 我试过的是:

^.*\([0-9]+:[0-9]+:[0-9]+\.[0-9]+\]\).*$

作为记录说明符,\ 1作为键。什么都没排序。 请问有人,我在做什么错? 除sort-regexp-fields外,我还开放其他可能性。

@Toby Speight感谢您的提示。我了解这个问题,以后会尽量避免出现此类问题。我只是用日志调试了很多东西,这种排序在将来的很多情况下对我很有帮助。我是SO的新手,所以请接受我的歉意。

@Picaud Vincent如果可以的话,我会投票赞成。从未使用过shell命令区域。实际上,这种情况下的排序行就足够了,但是您的方法将来会很有用,因此您的答案会被接受。谢谢。

3 个答案:

答案 0 :(得分:1)

您可以将任何bash命令应用于选定区域:

请按照以下步骤操作:

  1. 选择您的区域(或使用C-x h选择整个缓冲区)

  2. 键入C-u M-|,Emacs将提示您输入Shell命令,例如输入sort -k1 -r

就是这样! (注意,它是M-|而不是M-!

从Emacs文档中提取(您可以使用C-h k M-|来获取):

  

M- |运行命令shell-command-on-region(位于global-map中),   这是“ simple.el”中的交互式Lisp编译功能。

     

它绑定到M- |,。

     

(区域上的shell命令起始END命令和可选的输出缓冲区

     

替换错误-缓冲区显示-错误-缓冲区-不连续-P)

     

在下壳中以区域为输入执行字符串COMMAND。   通常在临时缓冲区“ Shell命令”中显示输出(如果有)   输出”;前缀arg表示用它替换区域。返回   退出代码。

换句话说,M-|运行shell命令并在“ Shell Command Output”缓冲区中显示输出。如果您希望此输出替换所选区域,则必须在M-|命令前加上前缀,这是我们的C-u命令(步骤2)。


在此处回答@Toby Speight的评论是一个示例。我将这些行(您的question provided link)用作初始缓冲区

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!

我键入:C-x h C-u M-| sort -k1 -r <RET>(其中<RET>代表“返回”键盘键),结果我的缓冲区现在包含:

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!
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! 

答案 1 :(得分:1)

尽管Picaud Vincent的答案描述了emacs用户在其工具栏中拥有的一种重要方法,但我还是希望记录下评论中的答案,因为它很简单,并且以最小的麻烦来解决了OP的问题:< / p>

  • 标记适当的区域(也许用mongod标记整个缓冲区)。
  • C-x h

答案 2 :(得分:0)

可以使用sort-regexp-fields,但是鉴于时间戳记位于行的开头(并且您将ISO 8601格式用于时间戳记),这意味着它们可以是用sort-lines非常简单地排序。假设您要对整个缓冲区进行排序,那只是

(sort-lines nil (point-min) (point-max))

您使用的方法仅会匹配时间戳记的 time 部分,因此最终可能会混入不同的日期。