UNIX 或 Linux 排序:仅对条目的第一部分进行排序

UNIX 或 Linux 排序:仅对条目的第一部分进行排序

我正在研究一个复杂的问题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 个字符排序)或者:
  • 添加第二个字段分隔符?(如管道字符)

答案1

-k2没有停止位置。停止位置默认为行尾。after排序在 之前before,因此出现问题。

如果您只想按时间戳排序,那么针对您的特定情况的可能解决方案之一是-t: -k2,4.7。 原因如下:

logs.10.txt:2022-10-07 10:33:05.6673 | whatever
start=2     ^                        2nd field begins here
                          ^          3rd field begins here
                             ^       4th field begins here
stop=4.7                           ^ 7th character of the 4th field
whole key   ^^^^^^^^^^^^^^^^^^^^^^^^

logs.10.txt看起来像是一个任意名称。请记住,有些名称可能会破坏我们的逻辑。例如,如果log:foo.txt出现在您预期的位置logs.10.txt,那么其中的冒号将是我们没有预料到的分隔符实例。

此外你还-s想要稳定排序

如果两个具有相同键的对象在排序输出中出现的顺序与它们在要排序的输入数组中出现的顺序相同,则称该排序算法是稳定的。

sort -s -t: -k2,4.7

我对 GNU sort8.30 的测试表明-t: -k2,2.24,尽管第二个字段少于 24 个字符,但该方法仍然有效。这将是您要求的“仅对前 24 个字符进行排序”。我尚未找到有关此行为的任何明确文档。如果我是您,我不会使用-k2,2.24,以防万一。-k2,4.7肯定有效。

相关内容