Ostatnio zapragnąłem obejrzeć sobie zawartość z plikiem logu serwera Apache. Cel był następujący:

  • wybrać tylko określone linie przy użyciu polecenia grep
  • wyświetlić 20 ostatnich linii
  • wyświetlić je od końca, tak aby linie które pojawiają się na końcu były wyświetlane jako pierwsze

Dwa pierwsze punkty w realizacji są proste:

grep 'GET / ' access.log | tail -n 20

Teraz pozostaje odwrócić kolejność linii. Pierwsze moje skojarzenie to polecenie sort z przełącznikiem -r, czyli coś takiego:

grep 'GET / ' access.log | tail -n 20 | sort -r

Niestety, to nie zadziała. Dostaniemy nie odwróconą zawartość pliku, ale po prostu posortowany plik od wartości największej do najmniejszej.

Więc pozostaje dodanie numeracji do pliku (polecenie cut -n i posortowanie zawartości:

grep 'GET / ' access.log | tail -n 20 | cat -n | sort -rn

Efekt tym razem odpowiedni, ale jeszcze zostały dodatkowe linie z numeracją, można je usunąć za pomocą polecenia cut:

grep 'GET / ' access.log | tail -n 20 | cat -n | sort -rn | cut -f 2-

I koniec końców efekt jest zgodny z oczekiwaniami.

Przeglądając jeszcze dokumentację do polecenia cat zauważyłem jeszcze jedną komendę: tac, która działa jako odwrotność polecenia cat. Używając tej komendy, skrypt będzie wyglądał następująco:

grep 'GET / ' access.log | tail -n 20 | tac

I po sprawie :). Morał: warto czytać strony MAN, można zaoszczędzić sporo czasu, pisania i mocy maszyny.

Źródła