5 sposobów łączenia poleceń w CLI, które naprawdę się przydają

Z tego artykułu poznasz nie tylko kluczowe komendy wykorzystywane w interfejsie wiersza poleceń, ale i najbardziej przydatne sposoby ich łączenia, tak, aby łatwo i efektywnie pracować w CLI. Pokażemy m.in. jak wyświetlić kilka największych plików w katalogu, ustalić częstość występowania słów, otrzymać notyfikację po skończeniu pracy skryptu, a na koniec dostaniecie jeszcze takie bonusy jak głosząca mądrości krowa oraz tabliczka mnożenia z komendy awk.

Transparent Data
Blog Transparent Data
6 min readMar 24, 2020

--

Pojedyncze polecenia czy umiejętność ich łączenia w CLI — co jest ważniejsze w programowaniu

Istnieją różne podejścia w programowaniu. Jedni twierdzą, że każdy programista powinien znać najważniejsze typy komend w Command Line Interface (CLI) i to już wystarczy. Drudzy, że nie ma chyba minimum komend jakie trzeba zapamiętać, żeby być dobrym developerem.

W rzeczywistości, bardziej niż znajomość komend cat, find czy xargs, przydaje się naszym zdaniem umiejętność łączenia poleceń w taki sposób, że można wyświetlić zawartość wszystkich plików, znając tylko na przykład część ich nazwy (poniżej przykład dla nazw rozpoczynających się od sample_data)

lub używając kilku komend basha, wyświetlić swoje najczęściej używane polecenia w konsoli, np. pierwszych 50:

To w tym tkwi właśnie prawdziwa potęga powłoki.

Ważniejszym niż same komendy (które i tak zawsze można łatwo znaleźć w Google czy apropos) jest zrozumienie konceptów powłoki, jakiej się używa i systemu plików. Powłoka to bowiem nie tylko system operacyjny do sterowania całością, ale zarówno język skryptowy, jak i interaktywny język poleceń. Podchodząc do niej w ten sposób, naprawdę można wycisnąć sporo! To, co każdy dev musi znać w CLI, to zatem strumienie, przekierowania i pipeline’y — to one są właśnie przysłowiowym minimum każdego programisty.

Czas na praktykę! Zastrzegamy przy tym, że każdy problem można rozwiązać na kilka-kilkanaście różnych sposób. My przedstawiamy tu po jednym wybranym.

Kilka przydatnych połączeń poleceń w CLI

Problem do rozwiązania nr 1:

Potrzebujemy zastąpić w pliku pewien ciąg znaków innym ciągiem znaków i wynikowy plik zapisać pod inną nazwą

Rozwiązanie:

Jak widać, wykorzystaliśmy tu kombinację dwóch poleceń: cat i sed.

Polecenie cat służy łączeniu (konkatenacji) plików. Jeśli więc wpiszemy CLI:

to interfejs wyświetli nam oba te pliki, czyli pozwoli nam w nie zajrzeć.

Jeśli z kolei wpiszemy komendę:

to połączone pliki zapiszemy w pliku 3.

Komenda sed, to z kolei edytor strumieniowy, który służy do przetwarzania tekstu.

Problem do rozwiązania nr 2:

Musimy znaleźć wszystkie działające procesy http na serwerze

Rozwiązanie:

Polecenie ps aux odpowiada za wypisanie wszystkich procesów.

Polecenie grep wyszukuje z kolei wzorce w każdym pliku string. Co istotne, wyszukuje również wzorce oddzielone znakami nowej linii i pokazuje każdą linię pasującą do wzoru.

Ma też swoje inne warianty, jak:

  • grep -i — wyszukanie całego ciągu bez rozróżniania wielkości liter w pliku (np. “KRS”, “”Krs”, “krs”),
  • grep -c — wyszukanie liczby wersów, które pasują do podanego ciągu/wzorca,
  • grep -f — potraktuje szukany wzorzec, jako escapowany string,
  • grep -e — potraktuje szukany wzorzec, jako rozszerzone wyrażenie regularne,
  • grep -x zwróci nam wynik, tylko i wyłącznie, jeżeli do wzorca pasuje cała linia.

Problem do rozwiązania nr 3:

Chcemy wyświetlić 20 największych plików z danego katalogu, dla przykładu, katalogu /var/log

Rozwiązanie:

Polecenie du wyświetla statystykę zajętości dysku. Samo du /var/log/* nie odpowiedziałoby jednak od razu na pytanie, które pliki w katalogu są największe.

Potrzebowaliśmy zatem posortować wyniki od największych bloków za pomocą polecenia sort oraz ograniczyć listę wyników komendą head, która domyślnie wyświetla nam 10 pierwszych wierszy, ale gdy dodamy do niej -n (liczba), pozwoli nam ona wyświetlić więcej wierszy.

Co za tym idzie, gdybyśmy chcieli wyświetlić 20 najmniejszych plików z katalogu, polecenie head wystarczyłoby zastąpić komendą tail, która zawsze wyświetla ostatnie wiersze tekstu.

Problem do rozwiązania nr 4:

Potrzebujemy ustalić częstość występowania słów w pliku

W tym przykładzie użyjemy kilku narzędzi do procesowania tekstu.

Pierwszym jest sed. Polecenie sed, jak już wcześniej wspomnieliśmy, pozwala m.in. na manipulacje tekstem. Wejściowy plik najpierw przeprocesujemy w taki sposób, żeby każdy biały znak (lub białe znaki występujące po sobie) zamienić na znak nowej linii. W ten sposób zdanie w pliku: “wlazł kotek na płotek” zostanie zamienione na:

wlazł
kotek
na
płotek

Komenda, która tak ustawia kotka i inne słowa wygląda następująco:

Następnie, musimy jeszcze wyszukać w pliku tylko te wiersze, które są istotne (nie zawierają samych białych znaków, spacji itp.) do czego przydaje nam się polecenie grep. Potem wyniki trzeba posortować (sort -nr) i usunąć duplikaty, licząc jednocześnie ich wystąpienie (sort | uniq -c). Ostatecznie to czego poszukujemy będzie miało kształt:

Problem do rozwiązania nr 5:

Marzy nam się dostać notyfikację na ekranie po zakończeniu pracy skryptu/komendy (chcemy wiedzieć, że “job is done”)

Czasami niektóre skrypty potrafią dość długo pracować i marnowaniem czasu byłoby ślęczenie wówczas w konsoli i obserwowanie postępu. Programiści są pragmatyczni, więc dlaczego nie wykorzystać tej sytuacji, aby otrzymać powiadomienie na desktopie o zakończeniu działania procesu?

Wystarczy użyć polecenia terminal-notifier i wywołać je po zakończeniu procesu, na przykład:

Jeszcze lepszym rozwiązaniem jest stworzenie aliasu na notyfikację np:

Wówczas nasze wywołanie ograniczy się do:

a rezultat będzie wyglądać tak:

Bonus nr 1:

Tabliczka mnożenia z wykorzystaniem polecenia awk

Możliwe rozwiązanie pokazuje bardzo kreatywne złożenie kilku komend:

Polecenie seq tworzy ciąg cyfr (tutaj od 1 do 9), sed z takimi parametrami dodaje nową linię po każdej cyfrze i zwiększa licznik o jeden, a na samym końcu do gry wchodzi komenda awk, która dla każdego numeru wiersza mnoży jego wartość przez aktualną cyfrę.

W ten sposób otrzymujemy:

1x1=1

1x2=2 2x2=4

1x3=3 2x3=6 3x3=9

1x4=4 2x4=8 3x4=12 4x4=16

1x5=5 2x5=10 3x5=15 4x5=20 5x5=25

1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

Bonus nr 2:

“cowsay”

Cowsay to paczka na systemy unixowe, która generuje krowę (lub inne postacie) w formie “grafiki” ASCII. Jako argument do polecenia można przekazać dowolny tekst, który pojawi się w “dymku” postaci.

W połączeniu z innym bardzo leciwym programem do generowania losowych cytatów, aforyzmów i żartów, otrzymamy krowę, która za każdym razem uraczy nas jakąś mądrością z internetu.

Wpisując w interfejs wiersza poleceń:

otrzymamy:

Co więcej, można też przekazać parametr do pliku z “grafiką obrazka”

aby spersonalizować swoje ulubione postacie/krowy (gshuf — losuje):

--

--