Łukasz Borchmann

O budowie komendy na przykładzie (ls, cd oraz cp) oraz ścieżkach w systemach z rodziny Linux

Poniżej przykład komendy ( ls), służącej do zwracania listy plików w bieżącym katalogu, uruchomionej z opcjami l (od long, rozbudowana lista ze szczegółami, takimi jak data modyfikacji czy wielkość pliku) oraz h (od human-readable, co sprawia, że na szczegółowej liście zamiast rozmiaru pliku w bajtach mamy go w przyjaznym formacie, np. 1K, 256M, 7G).

Zapis w linii drugiej jest tożsamy z tym w linii pierwszej (można go rozumieć jako uproszczony). Polecenie to uruchomić można bez żadnych dodatkowych parametrów (jak w linii 3., w takim przypadku zwróci ono jedynie nazwy plików z bieżącego katalogu, w kompaktowej formie).

Taki sam sposób podawania opcji (w przykładzie wyżej  l oraz  h) mają inne polecenia linuksowe. Niekiedy zdarza się natomiast, że komenda wymaga podania pewnej (pewnych) wartości, takiej jak ścieżka do katalogu, do którego chcielibyśmy przejść (/home/usr1 w przykładzie z linii 1.):

Przykład z linii 2. (komenda cp) prezentuje sposób kopiowania pliku sgjp-20161009.tab z katalogu /data/ do katalogu domowego użytkownika usr1 (tj. /home/usr1), tak że otrzyma on nazwę sgjp.txt. Komenda cp z linii 3. skopiuje ten sam plik do katalogu /home/usr1, tak że będzie on miał nazwę taką jak w źródle (sgjp-20161009.tab), co można było zapisać również na sposób z linii 4.

Ścieżka do katalogu lub pliku w powyższych komendach podana jest począwszy od znaku /, którym oznacza się najwyższy w hierarchii plików katalog (root) w systemach linuksowych: linux-filesystem

Po przejściu do katalogu root (komendą cd /) oraz wylistowaniu plików (poleceniem ls) zobaczylibyśmy katalogi oznaczone na schemacie powyżej kolorem niebieskim. Zawartość katalogu można wyświetlić również nie przechodząc do niego, podając po komendzie ls ścieżkę do katalogu, który chcemy wylistować, np.:

Ułatwienia w pracy

Naciśnięcie klawisza Tab powoduje automatyczne „dopowiedzenie” nazwy pliku lub polecenia. Jeśli przykładowo zamierzamy skopiować plik /data/sgjp-20161009.tab, to nie musimy wpisywać jego pełnej nazwy – wystarczy przerwać wpisywanie po cp /data/sg, a następnie wcisnąć Tab, co spowoduje autouzupełnienie nazwy pliku, tak iż otrzymamy cp /data/sgjp-20161009.tab.

Ponadto nie istnieje konieczność ponownego wpisywania komendy, z której ostatnio korzystaliśmy – na przeglądanie ich historii pozwala wciśnięcie na klawiaturze strzałki w górę (w historii przemieszczać się możemy także w drugą stronę – strzałką w dół).

Podgląd dużych plików

Polecenia head i tail wykorzystuje się kolejno do wyświetlania początku pliku lub jego końca. Domyślnie (tj. bez podania dodatkowych opcji) zwrócą 10 pierwszych (lub ostatnich) linii z pliku:

Liczbę zwracanych linii można zmienić przy użyciu opcji n, po której podać należy wybraną liczbę:

Nieco inną zasadę działania ma polecenie more, które umożliwia przewijanie zawartości pliku od początku do końca (przyciskiem spacji lub enterem). Przegląd pliku zakończyć można – tak jak wykonywanie przeważającej większości pozostałych komend (będących w toku) – skrótem Ctrl+C.

Na podobnej zasadzie użyć można polecenia less, które ma zbliżoną zasadę działania, a dodatkowo umożliwia m.in. przewijanie w górę (strzałką). Tę komendę przerywamy poprzez naciśnięcie klawisza q.

Liczba słów i linii w pliku

Polecenie wc (od word count) służy do liczenia słów, znaków, linii lub bajtów. W przykładzie poniżej zaprezentowano jego użycie:

W pierwszym przypadku wynikiem będzie 6908664 25537189 401188360 sgjp-20161009.tab (kolejno liczba linii, znaków i bajtów oraz nazwa pliku), zaś w drugim – jedynie liczba linii oraz nazwa pliku (za co odpowiada opcja l).

Przekierowanie wyjścia do pliku

Wynik każdej komendy, zamiast wyświetlać go na ekranie, można przekierować do pliku. Służy do tego znak > dodawany po poleceniu wraz z następującą po nim nazwą pliku (lub ścieżką do niego), np.:

Zastosowanie > nadpisze bieżącą zawartość pliku o podanej nazwie (jeśli istnieje). W przypadku chęci dodania wyniku na końcu pliku (i nienadpisywania jego poprzedniej zawartości) wystarczy w miejsce > użyć >>, np.:

Przekierowanie wyjścia do innej komendy

Na podobnej zasadzie przekierować można wyjście jednej komendy do drugiej ? czynimy to stosując symbol | zamiast >. Przykładowo, wiedząc, że polecenie ls -l wyświetla informację o jednym pliku w jednej linii, zaś wc -l pozwala policzyć liczbę linii, można zastosować połączenie komend i policzyć liczbę plików w katalogu (linia 1. poniżej). Naturalnie można ją również zapisać do pliku (linia 2.).

Wyodrębnienie kolumny z pliku

Kolumnę (rozumianą jako pole z ustrukturyzowanego pliku tekstowego zawierającego separator, takiego jak CSV lub TSV) wyodrębnić można na wiele sposobów. Jednym z nich jest zastosowanie komendy awk (AWK to interpretowany język programowania, którego główną funkcją jest wyszukiwanie i przetwarzanie tekstu).

Plik tekstowy /data/sgjp-20161009.tab zawiera słownik gramatyczny języka polskiego, którego wycinek przedstawiono poniżej:

Składa się on z pól oddzielonych znakiem tabulatora (innymi słowy jest to plik TSV od tab-separated values), z których pierwsze trzy to kolejno: słowoforma, lemma (form podstawowa) oraz opis gramatyczny.

Ich wyodrębnienia przy użyciu awk dokonać można w poniższy sposób (jak łatwo się domyślić, numer po znaku dolara oznacza numer pola/kolumny w pliku):

Język (komenda) awk ma znacznie większe możliwości, o których będzie mowa w przyszłości.

Sortowanie pliku i tworzenie listy unikalnych rekordów

Sortowanie alfabetyczne pliku może być celem samym w sobie (jeśli zależy nam wyłącznie na uzyskaniu uporządkowanej w ten sposób listy), albo jedynie środkiem do celu (ponieważ niektóre komendy wymagają na wejściu posortowanej listy).

Przykładem tego drugiego zastosowania jest komenda uniq (zwracająca linie z pliku bez duplikatów, tj. jedynie takie, które nie powtarzają się w obrębie pliku), wymagająca na wejściu listy w porządku alfabetycznym (możliwej do uzyskania przy użyciu polecenia sort.

Rozpatrzmy plik /data/raw_NEW.txt w formacie TSV, którego wycinek przedstawia się następująco:

Jak widać w pierwszej kolumnie (pierwszym polu) zawiera on każdorazowo słowoformę (nieznormalizowaną, tj. bez np. sprowadzenia do liter jednakowej wielkości), a w drugiej – na tę chwilę nieistotną dla nas informację.

Unikalne wartości z pierwszej kolumny można uzyskać na poniższy sposób:

Jeśli znajdować się będziemy w naszym katalogu domowym, nie ma potrzeby podawania pełnych ścieżek do plików. Tę samą operację dokonać można poprzez polecenia:

Identyczny efekt uzyskać można bez konieczności tworzenia plików pierwsza-kolumna-raw_NEW.txt i posortowana-pierwsza-kolumna.txt stosując przekierowanie wyjścia opisane wyżej:

Powyższy kod odczytać można następująco:

  1. przejdź ( cd) do katalogu /home/usr1,
  2. wyodrębnij pierwszą kolumnę z pliku /data/raw_NEW.txt,
  3. przekaż ją do następnej komendy ( |),
  4. posortuj ( sort),
  5. przekaż wynik do następnej komendy ( |),
  6. zwróć tylko unikalne wartości ( uniq),
  7. przekieruj wyjście (zapisz je) do pliku tylko-unikalne.txt w katalogu, w którym się aktualnie znajduję ( > tylko-unikalne.txt).

Część wspólna list

Dysponując posortowaną listą w pliku tylko-unikalne.txt oraz listą słowoform ze słownika gramatycznego (slowoformy.txt) pokusić się można o zwrócenie ich części wspólnej (tj. linii znajdujących się równocześnie w obu plikach).

Komenda to umożliwiająca ( comm) również wymaga posortowanej listy na wejściu, dlatego w pierwszej kolejności uporządkujemy nasze słowoformy (linia 1.), a dopiero potem zapiszemy część wspólną do pliku (linia 2.) lub policzymy ile jest słów znajdujących się na obu listach (alternatywne metody w linii 3. i 4.):

Opcje 12 w poleceniu comm odpowiadają za zwrócenie części wspólnej, ale komenda ta umożliwia również inne porównania i tak comm -23 1.txt 2.txt zwróci linie, które znajdują się wyłącznie w pliku 1.txt (natomiast nie ma ich w 2.txt).