我有一个目录,其中包含来自不同应用程序的日志文件,它们的名称如下:
If Err.Number >= 1 Then
MsgBox ("Message")
End
Else: other code
End If
Exit Sub
所有名称都包含带有14位数字(年,月,日,时间)的时间戳。
我想用“ ls -l”打印所有文件名,并按名称中的时间戳排序。
newes文件(最高编号)应在最后打印。 如果一个时间戳有多个匹配项,则这些文件应按字母顺序排序。
如何将“ ls -l”与正则表达式排序结合使用?
答案 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不能自己做到。这个想法是:取出时间戳记,以每行的开头作为键,然后按时间戳记排序,最后删除插入的时间戳记。