在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))