Polecenia cat i tac wyświetlają zawartość plików tekstowych, ale jest w nich coś więcej niż na pierwszy rzut oka. Zanurkuj trochę głębiej i naucz się produktywnych sztuczek wiersza poleceń Linuksa.
Są to dwa proste, małe polecenia, często odrzucane jako po prostu takie – zbyt proste, aby miały jakiekolwiek realne zastosowanie. Ale kiedy już poznasz różne sposoby ich używania, zobaczysz, że są one w stanie doskonale poradzić sobie z ciężkim podnoszeniem ciężarów, jeśli chodzi o pracę z plikami.
Spis treści:
Komenda kota
kot jest przyzwyczajony zbadać zawartość plików tekstowychi połączyć części plików razem w większy plik.
Kiedyś – w epoce dial-up modem—Pliki binarne były często dzielone na kilka mniejszych plików, aby ułatwić pobieranie. Zamiast pobierać jeden duży plik, wycofałeś każdy mniejszy plik. Jeśli pojedynczy plik nie został poprawnie pobrany, wystarczy pobrać ten plik ponownie.
Oczywiście wtedy potrzebny był sposób na odtworzenie kolekcji mniejszych plików z powrotem w jeden działający plik binarny. Ten proces nazwano konkatenacją. I stąd właśnie przyszedł kot i stąd jego nazwa.
Połączenia szerokopasmowe i światłowodowe spowodowały, że ta szczególna potrzeba zanikła – podobnie jak piskliwe dźwięki dial-up – więc co pozostało kotu dzisiaj? Właściwie całkiem sporo.
Wyświetlanie pliku tekstowego
Aby wyświetlić listę zawartości pliku tekstowego w oknie terminala, użyj następującego polecenia.
Upewnij się, że plik jest plikiem tekstowym. Jeśli spróbujesz wyświetlić zawartość pliku binarnego w oknie terminala, wyniki będą nieprzewidywalne. Możesz skończyć z zablokowaną sesją terminala lub gorzej.
cat poem1.txt
Zawartość pliku poem1.txt jest pokazana w oknie terminala.
To tylko połowa słynnego wiersza. Gdzie reszta? Jest tutaj inny plik o nazwie poem2.txt. Możemy sprawić, że cat wyświetli zawartość wielu plików za pomocą jednego polecenia. Wszystko, co musimy zrobić, to uporządkować pliki w wierszu poleceń.
cat poem1.txt poem2.txt
To wygląda lepiej; mamy teraz cały wiersz.
Używanie kota z mniejszą ilością
Jest tam cały wiersz, ale przeleciał przez okno zbyt szybko, by przeczytać kilka pierwszych wersetów. Możemy przesłać dane wyjściowe z cat do less i przewijać tekst w dół we własnym tempie.
cat poem1.txt poem2.txt | less
Możemy teraz poruszać się wstecz i do przodu w tekście w jednym strumieniu, nawet jeśli jest on przechowywany w dwóch osobnych plikach tekstowych.
Numerowanie wierszy w pliku
Możemy mieć numer kota linii w pliku, tak jak jest wyświetlany. Aby to zrobić, używamy opcji -n (liczba).
cat -n poem1.txt
Linie są numerowane tak, jak są wyświetlane w oknie terminala.
Nie numeruj pustych wierszy
Udało nam się ponumerować wiersze według kota, ale liczone są również puste wiersze między wierszami. Aby linie tekstu były ponumerowane, ale ignorowały puste wiersze, użyj opcji -b (liczba-niepuste).
cat -b poem1.txt
Teraz wiersze tekstu są ponumerowane, a puste wiersze są pomijane.
Nie pokazuj wielu pustych wierszy
Jeśli w pliku znajdują się sekcje następujących po sobie pustych linii, możemy poprosić cat, aby zignorował wszystkie z wyjątkiem jednej pustej linii. Spójrz na ten plik.
Następne polecenie spowoduje, że cat wyświetli tylko jeden pusty wiersz z każdego zestawu pustych wierszy. Opcją, której potrzebujemy, aby to osiągnąć, jest opcja -s (squeeze-blank).
cat -s poem1.txt
Nie wpływa to w żaden sposób na zawartość pliku; zmienia tylko sposób, w jaki cat wyświetla plik.
Wyświetl karty
Jeśli chcesz wiedzieć, czy spacje są spowodowane spacjami czy tabulatorami, możesz to sprawdzić za pomocą opcji -T (show-tabs).
cat -T poem1.txt
Zakładki są reprezentowane przez znaki „^ I”.
Wyświetlanie końców linii
Możesz sprawdzić, czy na końcu znajdują się białe znaki, używając opcji -E (show-end).
cat -E poem1.txt
Końce wierszy są reprezentowane przez znak „$”.
Łączenie plików
Zapisywanie wiersza w dwóch plikach, po jednej połowie w każdym, nie ma sensu. Połączmy je razem i utwórzmy nowy plik z całym wierszem.
cat poem1.txt poem2.txt > jabberwocky.txt
Nasz nowy plik zawiera zawartość pozostałych dwóch plików.
Dołączanie tekstu do istniejącego pliku
Tak jest lepiej, ale tak naprawdę to nie jest cały wiersz. Brakuje ostatniego wersetu. Ostatni werset w Jabberwocky jest taki sam, jak pierwszy werset.
Jeśli mamy pierwszą zwrotkę w pliku, możemy dodać ją na dole pliku jabberwocky.txt i będziemy mieć cały wiersz.
W następnym poleceniu musimy użyć >>, a nie tylko>. Jeśli użyjemy pojedynczego>, nadpiszemy jabberwocky.txt. Nie chcemy tego robić. Chcemy dołączyć tekst na dole.
cat first_verse.txt >> jabberwocky.txt
I wreszcie wszystkie części wiersza są razem.
Przekierowanie stdin
Możesz przekierować dane wejściowe z klawiatury do pliku za pomocą cat. Wszystko, co wpiszesz, jest przekierowywane do pliku, dopóki nie naciśniesz Ctrl + D. Zauważ, że używamy pojedynczego>, ponieważ chcemy utworzyć plik (lub nadpisać go, jeśli istnieje).
cat > my_poem.txt
Ten dźwięk jak odległa turbina to prawdopodobnie Lewis Carroll wirujący w swoim grobie z dużą prędkością.
Polecenie tac
tac jest podobny do cat, ale wyświetla zawartość plików w odwrotnej kolejności.
Zobaczmy, że:
tac my_poem.txt
Plik jest wyświetlany w oknie terminala w odwrotnej kolejności. W tym przypadku nie ma to żadnego wpływu na jego wartość literacką.
Używanie tac ze stdin
Użycie tac bez nazwy pliku spowoduje, że będzie on działał na wejściu z klawiatury. Naciśnięcie Ctrl + D zatrzyma fazę wprowadzania, a tac wyświetli w odwrotnej kolejności wszystko, co wpisałeś.
tac
Po naciśnięciu Ctrl + D dane wejściowe są odwracane i wyświetlane w oknie terminala.
Używanie tac z plikami dziennika
Oprócz słabych sztuczek salonowych, czy tac może zrobić coś pożytecznego? Tak, może. Wiele plików dziennika dołącza swoje najnowsze wpisy na dole pliku. Używając tac (i, wbrew intuicji, head) możemy wrzucić ostatni wpis do okna terminala.
Używamy tac, aby wyświetlić plik syslog w odwrotnej kolejności i przesłać go do głowy. Mówiąc headowi, aby drukował tylko pierwszą otrzymaną linię (która dzięki tac jest ostatnią linią w pliku), widzimy najnowszy wpis w pliku syslog.
tac /var/log/syslog | head -1
head drukuje ostatni wpis z pliku syslog, a następnie kończy pracę.
Zauważ, że head drukuje tylko jedną linię - tak jak prosiliśmy - ale linia jest tak długa, że zawija się dwukrotnie. Dlatego w oknie terminala wygląda to jak trzy wiersze danych wyjściowych.
Używanie tac z rekordami tekstowymi
Ostatnią sztuczką, jaką tac ma w rękawie, jest piękno.
Zazwyczaj tac działa na plikach tekstowych, przechodząc przez nie wiersz po wierszu, od dołu do góry. Linia to sekwencja znaków zakończona znakiem nowego wiersza. Ale możemy powiedzieć, że tac współpracuje z innymi ogranicznikami. To pozwala nam traktować „fragmenty” danych w pliku tekstowym jako rekordy danych.
Powiedzmy, że mamy plik dziennika z jakiegoś programu, który musimy przejrzeć lub przeanalizować. Rzućmy okiem na jego format z mniejszym.
less logfile.dat
Jak widać, plik ma powtarzalny format. Istnieją sekwencje trzech wierszy szesnastkowy wartości. Każdy zestaw trzech wierszy kodu szesnastkowego ma wiersz etykiety rozpoczynający się od „= SEQ”, po którym następuje sekwencja cyfr.
Jeśli przewiniemy do końca pliku, zobaczymy, że jest ich dużo. Ostatnia ma numer 865.
Załóżmy, że z jakiegokolwiek powodu musimy pracować nad tym plikiem w odwrotnej kolejności, zapis danych po rekordzie danych. Należy zachować porządek trzech wierszy szesnastkowych w każdym rekordzie danych.
Zauważymy, że ostatnie trzy wiersze w pliku zaczynają się od wartości szesnastkowych 93, E7 i B8, w tej kolejności.
Użyjmy tac, aby odwrócić plik. Jest to bardzo długi plik, więc podzielimy go na mniej.
tac logfile.dat | less
To odwraca plik, ale nie jest to wynik, którego chcemy. Chcemy, aby plik został odwrócony, ale wiersze w każdym rekordzie danych muszą być w oryginalnej kolejności.
Wcześniej odnotowaliśmy, że ostatnie trzy wiersze w pliku zaczynają się od wartości szesnastkowych 93, E7 i B8, w tej kolejności. Kolejność tych wierszy została odwrócona. Ponadto linie „= SEQ” znajdują się teraz pod każdym zestawem trzech linii szesnastkowych.
tak na ratunek.
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less
Rozbijmy to.
Opcja -s (separator) informuje tac, czego chcemy użyć jako separatora między naszymi rekordami. Mówi tac, aby nie używał swojego zwykłego znaku nowej linii, ale zamiast tego używał naszego separatora.
Opcja -r (regex) mówi tac, aby traktował separator jako znak Wyrażenie regularne.
Opcja -b (przed) powoduje, że tac wyświetla separator przed każdym rekordem zamiast po nim (co jest typową pozycją domyślnego separatora, znaku nowej linii).
Ciąg -s (separator) ^ = SEQ. +[0-9]+ * $ jest odszyfrowane w następujący sposób:
Znak ^ oznacza początek wiersza. Po tym następuje = SEQ. +[0-9]+ * $. To instruuje tac, aby szukał każdego wystąpienia „= SEQ”. na początku wiersza, po którym następuje dowolna sekwencja cyfr (wskazana przez [0-9]), po którym następuje dowolny inny zestaw znaków (oznaczony * $).
Jak zwykle wprowadzamy wszystko do mniej.
Nasz plik jest teraz przedstawiony w odwrotnej kolejności, z każdą linią etykiety „= SEQ” wymienioną przed trzema liniami danych szesnastkowych. Trzy wiersze wartości szesnastkowych są w oryginalnej kolejności w każdym rekordzie danych.
Możemy to po prostu sprawdzić. Pierwsza wartość z pierwszych trzech wierszy szesnastkowych (które były ostatnimi trzema wierszami przed odwróceniem pliku) odpowiada wartościom, które zapisaliśmy wcześniej: 93, E7 i B8, w tej kolejności.
To niezła sztuczka dla jednowierszowego okna terminala.
Wszystko ma swój cel
W świecie Linuksa nawet pozornie najprostsze polecenia i narzędzia mogą mieć zaskakujące i potężne właściwości.
Filozofia projektowania prostych narzędzi które dobrze robią jedną rzecz, i które łatwo współpracują z innymi narzędziami, dały początek dziwnym, drobnym poleceniom, takim jak tac. Na pierwszy rzut oka wydaje się to trochę dziwne. Ale kiedy zajrzysz pod powierzchnię, pojawi się nieoczekiwana moc, którą możesz wykorzystać na swoją korzyść.
Albo, jak mówi inna filozofia: „Nie gardzcie wężem, który nie ma rogów, bo któż powie, że nie stanie się smokiem?”