我正在研究一个复杂的grep
,类似的东西grep -E -i "first|next" *.txt
,我得到的结果如下:
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), before Unsubscribe() |
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), after Unsubscribe() |
现在,我想根据时间戳对结果进行排序,这看起来很简单:
Prompt> grep ... | sort -t: -k2
...但是有一个问题:正如您所见,“之前”和“之后”经常发生在相同的十分之一毫秒内,并且sort
命令会切换它们:
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), after Unsubscribe() |
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), before Unsubscribe() |
我已经尝试在sort
命令中添加一个额外的字段分隔符,但这不起作用:
Prompt> grep ... | sort -t:| -k2
是否有可能:
- 在命令中添加长度参数
sort
?(仅按前 24 个字符排序)或: - 添加第二个字段分隔符?(如管道字符)
在
-k2
没有停止位置。停止位置默认为行尾。after
排序之前before
,因此问题。如果您只想按时间戳排序,那么针对您的特定情况的可能解决方案之一是
-t: -k2,4.7
. 这就是为什么:logs.10.txt
看起来像一个任意名称。请记住,某些名称可能会破坏我们的逻辑。例如,如果log:foo.txt
出现在您期望的位置,logs.10.txt
那么其中的冒号将是我们没有预料到的分隔符实例。另外你想要
-s
的,稳定的排序。我对 GNU
sort
8.30 的测试表明它-t: -k2,2.24
有效,尽管第二个字段短于 24 个字符。这将是您要求的“仅对前 24 个字符进行排序”。我还没有找到任何关于这种行为的明确文档。如果我是你,我不会使用-k2,2.24
,以防万一。-k2,4.7
肯定是有效的。