moreutils cz. 3 – combine, pee oraz chronic i cała reszta

Moreutils to pakiet 15 dodatkowych narzędzi do basha. Wszystkie są ciekawe, a część z nich potrafi być bardzo użyteczna. W tym artykule poświęcę trochę czasu poleceniom combine, pee oraz chronic.

Ten artykuł stanowi kontynuację serii, której pierwszą część oraz drugą część znajdziecie w portalu Linux.pl.

Instalacja

Pakiet moreutils nie jest domyślnie zainstalowany w systemie i trzeba go sobie doinstalować – w zależności od dystrubucji:

$ sudo pacman -S moreutils
$ sudo dnf install moreutils
$ sudo yum install moreutils
$ sudo apt-get install moreutils

Kombinowanie z plikami

Polecenie combine pozwala porównać dwa pliki tekstowe za pomocą operatorów logicznych. Dostępne są: and, not, or i xor:

  • and – wyświetla linie, które są w obu plikach,
  • not – wyświetla te, które są w pierwszym pliku, ale nie ma ich w drugim,
  • or – wyświetla linie, które są albo w jednym albo w drugim,
  • xor – wyświetla linie, które są albo w jednym albo w drugim, ale nie w obu.

O ile pierwsze dwa można łatwo zasymulować za pomocą grepa o tyle z pozostałymi trzeba by trochę pogłówkować. Tylko po co, skoro mamy gotowe narzędzie?

Składnia polecenia jest bardzo prosta:

$ combine <plik1> <operator> <plik2>

Kolejność linii w plikach nie ma znaczenia, ale porównywanie odbywa się wg porządku drugiego pliku. Oznacza to, że operacje nie są przemienne – na wyjściu linie będą posortowane tak jak w drugim pliku. Czyli

$ combine plik1.txt and plik2.txt

może dać inaczej posortowany wynik niż

$ combine plik2.txt and plik1.txt

Zazwyczaj nie ma to znaczenia, zawsze przecież można na końcu dodać sortowanie.

Używając znaku “-” można użyć standardowego wejścia jako jednego z plików:

$ cat log.txt | combine - and plik2.txt

W ten sposób można stworzyć filtr, który na podstawie zawartości pliku będzie pokazywać tylko te linie wyniku działania polecenia, które nas interesują.

Narzucającym się niemal zastosowaniem polecenia combine jest porównanie zawartości katalogów – krótki skrypt wylistuje pliki, które mają takie same nazwy, takie które się nie pokrywają itd. Ale to już zostawiam czytelnikom jako ćwiczenie domowe…

Jak zbudować rurociąg

Polecenie pee działa – jak zdaje się sugerować nazwa – podobnie jak znane i lubiane tee. tee przekierowuje standardowe wyjście do plików, pee natomiast potrafi rozdystrybuować dane ze standardowego wyjścia na kilka potoków:

$ echo "Linux.pl to najlepszy portal o Linuksie" | pee cat rev
Linux.pl to najlepszy portal o Linuksie
eiskuniL o latrop yzspeljan ot lp.xuniL

Ujmując polecenia w cudzysłowy możemy budować nieco bardziej skomplikowane konstrukcje:

$ cat file | pee 'sort -u > sorted' 'sort -R > unsorted'

W tym przypadku od razu otrzymamy dwa pliki – jeden posortowany, drugi nie.

Uwaga na błędy

Polecenie chronic ma nieco dziwną na pierwszy rzut oka funkcję. Mianowicie zatrzymuje całe wyjście polecenia jeśli działa ono prawidłowo. Jeśli natomiast pojawi się błąd – jest on wyświetlany. 

Po co likwidować wynik działania polecenia? Możliwości są co najmniej dwie:

  • przy uruchamianiu polecenia za pomocą crona – do niczego nie jest tam potrzebny,
  • w niektórych przypadkach w skryptach, kiedy polecenie wyświetla komunikaty, które nie są na potrzebne, ale chcemy wiedzieć, jeśli coś poszło nie tak.

W sumie można by sprawę zamknąć stwierdzeniem, że konstrukcja

$ polecenie  1>/dev/null

załatwia to tak samo, ale chronic ma jeszcze przełącznik -v, który w razie błędu wyświetla wszystkie informacje – jeśli było coś na stdout, to, co program otrzymał z stderr oraz kod błędu: 

$ chronic -v cat niematakiegopliku.txt
STDOUT:

STDERR:
/usr/bin/cat: niematakiegopliku.txt: Nie ma takiego pliku ani katalogu

RETVAL: 1

Dzięki temu chronic jest bardzo przydatny przy testowaniu i debugowaniu skryptów.

Reszta kompanii

W trzech kolejnych artykułach opisałem najciekawsze – moim zdaniem – elementy pakietu moreutils. Pozostałe wydają się mniej przydatne, a czasami wręcz egzotyczne. Niemniej pakiet jako taki jest bardzo pomocny, warto go zainstalować choćby ze względu na sponge.

Oto krótki opis pozostałych poleceń w pakiecie moreutils:

errno: wyświetla opis błędu. Numer błędu trzeba podać jako parametr.

ifdata: pozwala na uzyskanie różnych informacji o interfejsie sieciowym bez parsowania wyniku polecenia ifconfig (np. ifdata -pa eth0 wyświetli adres IP przypisany do tego interfejsu)

ifne: uruchamia polecenie jeśli na standardowym wejściu pojawią się jakiekolwiek dane.

isutf8: sprawdza czy plik tekstowy jest kodowany w UTF-8.

lckdo: uniemożliwia wielokrotne uruchomienie tego samego procesu. Ponieważ w nowszych wersjach Linuksa pojawiło się systemowe polecenie flock, które robi dokładnie to samo, polecenie lckdo zostanie usunięte z pakietu moreutils.

mispipe: przekierowuje do potoku dwa polecenia, zwraca kod wyjścia pierwszego z nich.

parallel: uruchamia wiele procesów równolegle.

ts: dodaje timestamp (datę i czas) do każdej linii wyjścia. Przydaje się przy tworzeniu loga.

zrun: automatycznie rozpakowuje plik przed przekazaniem go do polecenia. Dostępne formaty archiwów: gz bz2 Z xz lzma lzo.

Pakiet moreutils to trochę zbieranina: część poleceń jest rzadko wykorzystywana, ale są i takie, które przydają się niemal codziennie. Całość zajmuje tylko 280 kB na dysku i myślę, że to jest dobrze zainwestowane 280 kB.

Poprzedni post

Kosmiczny Pop!_OS 21.04 – wersja stabilna

Następny post
Redcore Linux

Redcore Linux 2101

Powiązane posty