在Emacs中按时间戳对行进行排序
我有一个日志文件,它是由几个线程编写的,因此没有顺序。 该日志包含如下条目:在Emacs中按时间戳对行进行排序,emacs,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中找到了排序的好答案: 这很好,但我想在Ema
[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中找到了排序的好答案:
这很好,但我想在Emacs中对其进行排序。我尝试使用sort regexp字段,但似乎我不够聪明,无法让它工作。
我尝试的是:
^.*\([0-9]+:[0-9]+:[0-9]+\.[0-9]+\]\).*$
作为记录说明符和\1作为键。什么也没分类。
谁能告诉我,我做错了什么?
除了对regexp字段进行排序之外,我还支持其他可能性
@托比·斯佩特谢谢你的提示。我理解这个问题,今后将尽量避免此类问题。我只是调试了很多日志记录,这种排序将在未来的很多情况下对我非常有帮助。我是新来的,所以请接受我的道歉
@皮考德·文森特:如果可以的话,我会投赞成票。从未在区域上使用shell命令。实际上,对于这种情况,排序行已经足够了,但是您的方法在将来会很有用,所以您的答案是可以接受的。谢谢。您可以将任何bash命令应用于所选区域: 请按照以下步骤操作:
C-x h
选择整个缓冲区)C-u M-|
,Emacs将提示您输入shell命令,例如输入sort-k1-r
M-|
而不是M-!
)
从Emacs文档中提取(您可以通过C-h k M-|
获得):
M-|在区域上运行命令shell命令(可在全局映射中找到),
这是“simple.el”中的交互式编译Lisp函数
它绑定到M-|
(区域开始结束命令和可选输出缓冲区上的shell命令)
替换错误-缓冲区显示-错误-缓冲区-非连续-p)
在下位shell中以区域作为输入执行string命令。
通常在临时缓冲区的外壳命令中显示输出(如果有)
输出';前缀arg表示用它替换区域。归还
退出命令代码
换句话说,M-|
运行shell命令并在“shell命令输出”缓冲区中显示输出。如果希望此输出替换所选区域,则必须在M-|
命令前面加前缀,这是我们的C-u
命令(步骤2)
在这里回答@Toby Speight评论就是一个例子。我使用这些行作为初始缓冲区(您的) I键入:
C-x h C-u M-| sort-k1-r
(其中
表示“返回”键盘键),因此我的缓冲区现在包含:
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!
尽管Picaud Vincent的答案描述了emacs用户工具带中的一个重要方法,但我想为后代记录评论中的答案,因为它很简单,可以用最少的麻烦简单地解决OP的问题:
- 标记适当的区域(可能使用
标记整个缓冲区)C-x h
M-x排序行
排序regexp字段
,但鉴于时间戳位于行的开头(并且您使用ISO 8601格式作为时间戳),这意味着可以非常简单地使用排序行对它们进行排序。假设您想对整个缓冲区进行排序,那么
(sort-lines nil (point-min) (point-max))
您使用的方法将只匹配时间戳的时间部分,因此您可能会以不同的日期混合而告终。假设时间戳始终位于行的第一位,那么M-x排序行是否会按您的要求进行排序?(首先键入C-x h
以选择整个缓冲区)标准的排序行
调用应该足够了-这是使用ISO-8601时间戳的最大优势!关于使用诸如Emacs之类的程序的问题对于堆栈溢出来说是离题的,除非它们特定于编程模式;您可以在或上获得帮助。如果你的问题是关于Emacs编程的,那么请包括一个你遇到问题的Lisp或C代码的例子。虽然这可能是解决问题的一个有价值的提示,但一个好的答案也可以说明解决方案。请提供示例代码来说明您的意思。另一方面,请考虑将此作为评论来写。但是,我不确定是否能很好地理解您的请求:没有代码,因为解决方案只是在Emacs下键入C-xhc-um-| sort-k1-r。我们本可以为此定义一个Emacs lisp函数,但这肯定是一个过分的解决方案。为了更清晰,我添加了一个完整的用法示例。事实上,一系列交互式按键实际上是一个或答案,而不是一个。当然,问题可能出现在错误的网站上——我已经做出了相应的评论。@TobySpeight我将在将来尽量避免此类问题/答案。我确实理解这个问题。
(sort-lines nil (point-min) (point-max))