Często podczas przeglądania plików lub automatyzacji pewnych czynności w Linuxie chcemy skrócić ilość operacji. W poniższym wpisie omówię komendy head, tail, sort, find, które ułatwiają życie.
- head – wyświetlanie n linii na początku pliku (domyślnie 10)
- tail – wyświetlanie n linii na końcu pliku (domyślnie 10)
- sort – sortowanie zawartości na wyjściu
- find – wyszukiwanie plików w danej lokalizacji
Odczyt zawartości pliku – head i tail
Zdarza się tak, że potrzebujesz odczytać tylko fragment pliku, a nie jego całość. Masz plik konfiguracyjny, którego interesująca dla Ciebie część jest na początku. W tej sytuacji możesz skorzystać z polecenia head. Aby przejrzeć zawartość na początku pliku wywołaj komendę:
# head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin admin:x:3:4:admin:/var/admin:/sbin/nologin service:x:4:7:lp:/var/spool/serviced:/sbin/nologin
Przełącznik -n 5 wskazuje, że zostanie wyświetlone pierwszych 5 linii. Możesz również użyć opcji po prostu -5 (bez n).
Analizując logi z aplikacji będziesz potrzebować ostatnich zdarzeń, a nie wyświetlania całego pliku, który ma 1200 linii. Co w takim razie możesz z tym zrobić? Użyj tail.
[root@hadoop-node log]# tail -5 secure May 15 05:34:00 hadoop su: pam_unix(su-l:session): session opened for user ambari-qa by (uid=0) May 15 05:34:01 hadoop su: pam_unix(su-l:session): session closed for user ambari-qa May 15 05:34:01 hadoop su: pam_unix(su-l:session): session closed for user ambari-qa May 15 05:34:01 hadoop su: pam_unix(su-l:session): session opened for user ambari-qa by (uid=0) May 15 05:34:01 hadoop su: pam_unix(su-l:session): session opened for user ambari-qa by (uid=0)
Tak jak w przykładzie powyżej możesz użyć przełącznika z liczbą wierszy, które ma wyświetlić. Domyślnie jest to 10 linii.
W tymi miejscu warto również wspomnieć o tailf. To nic innego jak „podążanie” za rosnącym plikiem. Krótko mówiąc na bieżąco widzimy dopisywaną zawartość do pliku. Dotyczy to logów aplikacji lub systemowych. Jest to bardzo przydatne podczas analizy logów w czasie rzeczywistym. Jej użycie ogranicza się do wpisania tailf nazwa_pliku.
Wyszukiwanie plików
Komenda find służy do wyszukiwania plików oraz katalogów. Składnia samego polecenia jest bardzo prosta i składa z komendy głównej find, ścieżki oraz kryterium wyszukiwania. Chcąc zdefiniować kryterium wyszukiwania możemy wybrać takie parametry jak:
- -name – nazwa pliku
- -type – określenie typu wyszukiwania f (pliku) lub d (katalogu)
- -user – znalezienie plików należących do użytkownika x
- -size – określony rozmiar bloku
- -atime – czyli kiedy plik był ostatnio odczytywany lub wyświetlany. Nie mówimy tutaj o modyfikacji pliku
- -mtime – kiedy ostatnio modyfikowany był plik
Do powyższych parametrów możemy również dodać:
- -print – wyświetlenie ścieżki do każdego pliku, który jest wynikiem
- – exec – wykonanie komendy w poleceniu find. Zadziała to trochę na zasadzie pętli while. Np. find / -size +100M -exec /bin/rm {} \; Znajdź wszystkie pliki, które ważą więcej niż 100M i usuń je.
Przykłady
- Znajdź wszystkie pliki z rozszerzeniem .log w katalogu /var/log
- # find /var/log -name „*.log”
- Robisz porządki w systemie i chcesz usunąć wszystkie pliki, które zawierają w nazwie „.old”. Do tego ćwiczenia możesz podejść na dwa sposoby. Dobrze znasz już środowiska, na którym pracujesz tj. strukturę plików oraz katalogów i nie potrzebujesz potwierdzenia, więc usuwasz wszystko co spełnia warunke. Druga opcja, za każdym razem potwierdzasz usunięcie „y”.
- # find / -name „*.old” -exec rm -f {} \;
- # find / -name „*.old” -ok rm -f {} \;
- Zmień uprawnienia dla wszystkich katalogów w systemie find . -type d -exec chmod 755 {} \;
- Zmień uprawnienia dla wszystkich plików na 644, ale nie bierz pod uwagę katalogów find ./ -type f -exec chmod 644 {} \;
- Znajdź pliki ważące więcej niż 50M find / -size +50M -print
- Strzeż się wykonania tej komendy find . -exec /bin/rm {} \; w ramach testów na maszynie wirtualnej możesz ją odpalić.
Sortowanie plików
Sortowanie zawartości przydaje się szczególnie w sytuacji, w której do pliku konfiguracyjnego dopisywane są nowe wpisy, jak np. w pliku /etc/passwd. Po dodaniu użytkownika wpis dopisywany jest na końcu linii.
Kiedy chcesz przeanalizować zawartość lub wyszukać konkretny wpis komenda sort może okazać się bardzo pomocna (jest jeszcze opcja użycia grep). Tak na prawdę komenda sort daje szereg możliwości sortowania pliku:
- -r – sortowanie odwrotne (z do a, zamiast a do z)
- -n – sortowanie numeryczne zamiast ciągu znaków ASCII. Korzystam np. przy sortowaniu listy „ciężkich plików” w zadanej lokalizacji sort -n -r
- -t [znak] -k[cyfra] – sortowanie konkretnej kolumny z określeniem znaku separatora. Np. sort -t: -k5 /etc/passwd
Przykłady
Sortowanie po 5. kolumnie w pliku /etc/passwd z uwzględnieniem separatora :
Zawartość pliku przed i po sortowaniu
[marcin@linux-host marcin]# cat fragment_passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin admin:x:3:4:admin:/var/admin:/sbin/nologin service:x:4:7:lp:/var/spool/serviced:/sbin/nologin [marcin@linux-host marcin]# sort -t: -k5 fragment_passwd admin:x:3:4:admin:/var/admin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin service:x:4:7:lp:/var/spool/serviced:/sbin/nologin root:x:0:0:root:/root:/bin/bash
Sortowanie kilku plików i zapisanie wyniku do osobnego
[marcin@linux-host marcin]# cat plik1 A029S14 Fzkd@40a Bodk314ak [marcin@linux-host marcin]# cat plik2 2smZfkw Godp1em XMAkxozm Fqowp3 [marcin@linux-host marcin]# sort plik1 plik2 -o plik3 [marcin@linux-host marcin]# cat plik3 2smZfkw A029S14 Bodk314ak Fqowp3 Fzkd@40a Godp1em XMAkxozm
Może się zdarzyć, że w plikach powtarzają się zduplikowane wpisy. Aby wyświetlić unikalne wartości dodaj przełącznik -u do polecenia sort.
Komendy head, tail, sort, find pomagają w sprytny sposób wyciągnąć interesujące dla nas informacje. Jednocześnie nie musimy wkładać wiele wysiłku. Praca z Linuxem to sama przyjemność 🙂
Zobacz inny wpis, który przygotowałem – Lista 85 komend dla Linuxa.