2014-12-24 157 views
5

我正在編寫一個shell腳本來檢查某些參數,例如在目錄/ var/log內最近2小時內生成的日誌文件內部的錯誤或異常。所以這是我使用命令:如何使用排序命令列出文件,但不使用ls -lrt命令

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" 

,但它無法正常工作。 對此的任何幫助真的很感激。

回答

0

可以使用-printf參數find,然後sort前面加上修改的時間,然後取出修改的時間與sed:由前置

find /var/log -mmin -120 -printf '%[email protected]:%p\n' | sort -V | sed -r 's/^[^:]+://' | xargs egrep -i "error|exception" 
  • find ... -printf '%[email protected]:%p\n'打印出每個找到的文件(%p)自UNIX紀元(%[email protected];例如,1419433217.1835886710)和一個冒號分隔符(:)以來的秒數,每個都在新行(\n)上。

  • sort -V通過修改時間自然排序文件,因爲它位於每行的開頭(例如,1419433217.1835886710:path/to/the/file)。

  • sed -r 's/^[^:]+://'需要每一行的格式123456789.1234:path/to/the/file,並剝離了修改時間,只留下文件路徑path/to/the/file

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

非常感謝你..它的工作.. –