我有一个日志文件,该文件由多个线程编写,因此顺序不正确。 日志中包含以下条目:
[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命令区域。实际上,这种情况下的排序行就足够了,但是您的方法将来会很有用,因此您的答案会被接受。谢谢。
答案 0 :(得分:1)
您可以将任何bash命令应用于选定区域:
请按照以下步骤操作:
选择您的区域(或使用C-x h
选择整个缓冲区)
键入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 部分,因此最终可能会混入不同的日期。