ls -l->按正则表达式对文件排序

时间:2018-08-06 12:15:18

标签: regex linux sorting sh ls

我有一个目录,其中包含来自不同应用程序的日志文件,它们的名称如下:

If Err.Number >= 1 Then
MsgBox ("Message")
End
Else: other code
End If
Exit Sub

所有名称都包含带有14位数字(年,月,日,时间)的时间戳。

我想用“ ls -l”打印所有文件名,并按名称中的时间戳排序。

newes文件(最高编号)应在最后打印。 如果一个时间戳有多个匹配项,则这些文件应按字母顺序排序。

如何将“ ls -l”与正则表达式排序结合使用?

2 个答案:

答案 0 :(得分:2)

Perl解决方案:

perl -le 'print for sort { ($a =~ /\d{14}/g)[0] cmp ($b =~ /\d{14}/g)[0]
                           or $a cmp $b } glob "*log*"'

有关如何在Perl中提供自定义比较器的详细信息,请参见sort

  • -l将最终换行符添加到打印行中
  • \d{14}匹配14位数字
  • /g修饰符匹配会在列表上下文中返回匹配的子字符串,[0]选择其中的第一个。

答案 1 :(得分:1)

使用gnu sed的这一行应该会有所帮助:

ls -1|sed -r 's/.*([0-9]{14}).*/\1 &/' f|sort -n|sed 's/^[0-9]* //' 

Ls不能自己做到。这个想法是:取出时间戳记,以每行的开头作为键,然后按时间戳记排序,最后删除插入的时间戳记。