如何使用sort命令而不是ls -lrt命令列出文件?

5

我正在编写一个shell脚本,检查在/var/log目录下在过去2小时内生成的日志文件中出现的错误或异常参数。以下是我使用的命令:

find /var/log -mmin -120|xargs egrep -i "error|exception"

它展示了文件名及其对应的参数(错误和异常),但是文件列表不是按时间顺序排列的。我是说输出结果类似于这样(顺序):

/var/log/123.log:RPM returned error
/var/log/361.log:There is error in line 1
/var/log/4w1.log:Error in configuration line

但是这3个日志文件生成的顺序是不同的。
/var/log>ls -lrt
Dec24 1:19 361.log
Dec24 2:01 4w1.log
Dec24 2:15 123.log

所以我希望输出的顺序与原始顺序相同,就像这样:

/var/log/361.log:There is error in line 1
/var/log/4w1.log:Error in configuration line
/var/log/123.log:RPM returned error

我尝试了这个:
find /var/log -mmin -120|ls -ltr|xargs egrep -i "error|exception"

但它没有起作用。非常感谢任何帮助。
2个回答

1
如果您的文件名没有任何特殊字符(如换行符等),那么您只需要再调用一次 xargs 即可:
find . -type f -mmin -120 | xargs ls -tr | xargs egrep -i "error|exception"

或者,如果你的文件名包含上述特殊字符:
find . -type f -mmin -120 -print0 | xargs -0 ls -tr | xargs egrep -i "error|exception"

0

您可以使用-printf参数在find命令中添加修改时间,然后进行sort排序,最后使用sed删除修改时间:

find /var/log -mmin -120 -printf '%T@:%p\n' | sort -V | sed -r 's/^[^:]+://' | xargs egrep -i "error|exception"
  • find ... -printf '%T@:%p\n' 打印出每一个找到的文件(%p),在其前面加上自UNIX纪元以来的秒数(%T@;例如:1419433217.1835886710)和冒号分隔符(:),每个打印在新行上(\n)。

  • sort -V 根据修改时间对文件进行自然排序,因为它位于每一行的开头 (例如:1419433217.1835886710:path/to/the/file)。

  • sed -r 's/^[^:]+://' 接受格式为123456789.1234:path/to/the/file 的每一行,并剥离修改时间,只保留文件路径path/to/the/file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接