Jak korzystać z poleceń cat and tac w systemie Linux

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.

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

cat poem1.txt w oknie terminala

Zawartość pliku poem1.txt jest pokazana w oknie terminala.

zawartość poem1.txt 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

cat poem1.txt poem2.txt w oknie terminala

To wygląda lepiej; mamy teraz cały wiersz.

zawartość poem1.txt i poem2.txt w oknie terminala

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

kot poem1.txt poem2.txt |  mniej w oknie terminala

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.

zawartość poem1.txt i poem2.txt w less w oknie terminala

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

cat -n poem1.txt w oknie terminala

Linie są numerowane tak, jak są wyświetlane w oknie terminala.

zawartość poem1.txt z ponumerowanymi wierszami 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

cat -b poem1.txt w oknie terminala

Teraz wiersze tekstu są ponumerowane, a puste wiersze są pomijane.

numerowane wiersze pomijające puste l; ines w oknie terminala

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.

zawartość pliku z kolejnymi pustymi wierszami w oknie terminala

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

cat -b poem1.txt w oknie terminala

Nie wpływa to w żaden sposób na zawartość pliku; zmienia tylko sposób, w jaki cat wyświetla plik.

Wiele pustych wierszy jest ignorowanych w oknie terminala

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

cat -T poem1.txt w oknie terminala

Zakładki są reprezentowane przez znaki „^ I”.

zawartość poem1.txt z zakładkami wyświetlanymi w oknie terminala

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

cat -T poem1.txt w oknie terminala

Końce wierszy są reprezentowane przez znak „$”.

zawartość poem1.txt z końcami linii wyświetlanymi w oknie terminala

Łą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

cat poem1.txt poem2.txt> jabberwocky.txt w oknie terminala ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> użyjmy cat do sprawdzenia naszego nowego pliku: </p>
<pre> cat jabberwocky.txt </ pre > <p> <img loading =

Nasz nowy plik zawiera zawartość pozostałych dwóch plików.

zawartość pliku jabberwocky.tx w oknie terminala

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

cat first_verse.txt >> jabberwocky.txt w oknie terminala ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Sprawdźmy zawartość pliku jabberwocky.txt: </p>
<pre> cat jabberwocky.txt < / pre> <p> <img loading =

I wreszcie wszystkie części wiersza są razem.

zawartość jabberwocky.txt w oknie terminala

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

cat> my_poem.txt w oknie terminala ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Możemy zacząć pisać, gdy tylko wydamy polecenie.  Gdy skończymy, naciskamy Ctrl + D.  Następnie możemy sprawdzić zawartość nowego pliku: </p>
<pre> cat my-poem.txt </pre>
<p> <img loading =

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

tac my_poem.txt w oknie terminala

Plik jest wyświetlany w oknie terminala w odwrotnej kolejności. W tym przypadku nie ma to żadnego wpływu na jego wartość literacką.

my_poem.txt wymienione w odwrotnej kolejności w oknie terminala

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

tac pracuje ze stdin w oknie terminala

Po naciśnięciu Ctrl + D dane wejściowe są odwracane i wyświetlane w oknie terminala.

wyjście z tac przy użyciu stdin 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

tac / var / log / syslog |  head -1 w oknie terminala

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.

ostatni wpis z syslog w oknie terminala

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

mniej logu w oknie terminala

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.

u góry pliku dziennika w oknie terminala

Jeśli przewiniemy do końca pliku, zobaczymy, że jest ich dużo. Ostatnia ma numer 865.

na dole pliku dziennika w oknie terminala

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

tac logfile.dat |  mniej w oknie terminala

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.

odwrócony plik dziennika w less w oknie terminala

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

tac -b -r -s ^ = SEQ. +[0-9]+ * $ logfile.dat |  mniej w oknie terminala

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.

odwrócony plik dziennika z prawidłowo utworzonymi rekordami danych

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?”