2014-12-24 12 views
5

Piszę skrypt powłoki, aby sprawdzić niektóre parametry, takie jak błędy lub wyjątki w plikach dziennika, które są generowane w ciągu ostatnich 2 godzin w katalogu/var/log . Więc to jest polecenie używam:Jak wyświetlić listę plików za pomocą komendy sort, ale nie komendy ls -lrt

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

jest wyświetlenie listy nazw plików i jej odpowiednich parametrów (Błędy i wyjątki) ale lista plików nie są jak na sekwencji czasowej. Mam na myśli wynik podobny do tego (sekwencja):

/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 

Ale kolejność generowania tych 3 plików dziennika jest inna.

/var/log>ls -lrt 
Dec24 1:19 361.log 
Dec24 2:01 4w1.log 
Dec24 2:15 123.log 

Więc chcę wyjście w tej samej kolejności, to znaczy tak:

/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 

Próbowałem to:

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

ale to nie działa. Każda pomoc w tej sprawie jest naprawdę doceniana.

Odpowiedz

0

można poprzedzić czas modyfikować za pomocą -printf argument find, potem sort, a następnie usunąć czas modyfikowany 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' drukuje każdego znalezionego pliku (%p) poprzedzając przez sekundy od czasów UNIX (%[email protected], np. 1419433217.1835886710) i separator dwukropek (:), każdy w nowej linii (\n).

  • sort -V sortuje pliki naturalnie w czasie modyfikacji, ponieważ znajduje się na początku każdej linii (np. 1419433217.1835886710:path/to/the/file).

  • sed -r 's/^[^:]+://' bierze każdą linię w formacie 123456789.1234:path/to/the/file i wycina czas modyfikacji pozostawiając tylko ścieżka do pliku path/to/the/file

1

Jeśli nazwy plików nie ma żadnych znaków specjalnych (takich jak znaki nowej linii, itp) wszystko czego potrzebujesz jest kolejnym wezwaniem do xargs:

find . -type f -mmin -120 | xargs ls -tr | xargs egrep -i "error|exception" 

lub jeśli nazwy plików zawierają znaki specjalne powiedział:

find . -type f -mmin -120 -print0 | xargs -0 ls -tr | xargs egrep -i "error|exception" 
+0

Dziękuję bardzo .. To zadziałało .. –

Powiązane problemy