Dogadać się z Linuksem. Konsola, podstawy cz.2
Zapraszam do lektury drugiej części artykułu poświęconego systemowi Linux i wykorzystania konsoli do zarządzania systemem. Rozpoczniemy od czegoś prostego – polecenia file.
Artykuły powiązane:
File – informacja o typie pliku
Narzędzie file dostarcza informacji o tym z jakim plikiem mamy do czynienia. Składnia polecenia: file <nazwa_pliku> Jak można zauważyć na rysunku poniżej wydanie polecenia odnośnie do plików: plik, plik2 oraz bash zwróciło informację o tym, że pierwszy jest dokumentem XML, drugi plikiem HTML a ostatni plikiem binarnym. Gdy do końca nie wiesz z jakim plikiem masz do czynienia (w systemie Windows jest łatwiej, gdyż w identyfikacji pliku pomaga rozszerzenie, w systemie Linux ich się nie stosuje) użyj narzędzia file.
Aliasy
System Linux umożliwia tworzenia tzw. aliasów, czyli skrótów, dzięki temu mamy możliwość wywołania polecenie bez konieczności użycia całej składni polecenia wraz z parametrami.
W trakcie poznawania systemu Linux bardzo często miałem nawyk czyszczenia ekranu za pomocą windowsowego polecenia cls, a jak wiadomo w powłoce bash te polecenie nie występuje, bo do czyszczenia okna używa się komendy clear bądź tput clear. Czy oznacza to, że na clear jesteśmy skazani? Nie, ratują nas aliasy. Należy stworzyć takie powiązanie, które sprawi, że użycie cls wywoła polecenie clear. Utworzenie aliasu możliwe jest za pomocą polecenia: alias <nazwa_aliasu>= „<polecenie>” Tak więc aby sprawić, że linuxowe polecenie clear zostanie wykonane po wpisaniu windowsowego cls należy użyć polecenia: alias cls=”clear”
Aliasy dodatkowo mogą być wykorzystane do poruszania się po systemie plików. Gdy bardzo często odwołujesz się do jakiegoś miejsca na dysku możesz stworzyć alias, który będzie łączył dany folder z przyjazną dla nas nazwą. Poniżej przykład utworzenia aliasu: dok po wywołaniu, którego będziemy przenoszeni do lokalizacji: /home/luk/Dokumenty
Ciekawe efekty uzyskamy, gdy alias połączymy z zmienną.
Połączyliśmy alias dok z zmienną DOK, po wydaniu polecenia dok jesteśmy przekierowani do zmiennej, która powoduje przejście do zdefiniowanego katalogu. Dodatkowo utworzoną zmienną możemy wykorzystać w poleceniach np. gdy wykonujemy kopiowanie. Poniżej przykład skopiowania pliku: plik1 do lokalizacji /home/luk/Dokumenty która to lokalizacja została powiązana z zmienną DOK.
Aby przejrzeć listę utworzonych aliasów wydaj komendę: alias
Aby usunąć alias należy skorzystać z polecenia: unalias <nazwa_aliasu>
Wszystkie zmienne i aliasy utworzone do tej pory będą istnieć tak długo jak długo będzie działać system. Oznacza to, że po wykonaniu restartu systemu utworzone zmienne oraz aliasy przestaną obowiązywać. Aby uniknąć konfiguracji tych parametrów po każdorazowym uruchomieniu systemu należy ich definicje zapisać w pliku: .bashrc W tym pliku zapisane są ustawienia konsoli użytkownika, domyślnie znajduje się on w katalogu domowym (w przypadku użytkownika root plik znajduje się w /root).
Gdy skończymy edytować plik .bashrc należy go przeładować za pomocą polecenia: . .bashrc.
Po wprowadzeniu zmian (dodanie kropki do już istniejącej zmiennej PATH, dodanie nowej zmiennej DOK oraz utworzenie aliasu cls), zapisaniu pliku i przeładowaniu wszystkie wykonane wpisy znajdują odzwierciedlenie w użytych poleceniach.
Spacja i znaki specjalne
Zanim Czytelniku będziesz próbował testować opisane niżej polecenia należy chwilkę zatrzymać się i wyjaśnić zasady jakie obowiązują, gdy używamy spację lub znaki specjalne. Praca z plikami, które wykorzystują te znaki powoduje pewne problemy, gdyż znaki te i występujące po nich ciągi tekstu, będą traktowane jako parametr lub odwołania np. do pliku.
W przypadku pliku, który w nazwie zawiera spację lub znak specjalny, aby odwołanie do niego zakończyło się sukcesem wystarczy, że nazwę pliku obejmiemy cudzysłowem. Poniżej przykład, w którym utworzyłem dwa pliki: pierwszy plik zawiera spacje – nazwa pliku: plik ze spacjami; drugi zaś plik który w swojej nazwie zawiera znak specjalny > – nazwa pliku: plikiznanspecjalny> Jak widać tradycyjne odwołanie do obu plików (użyto polecenia: ls – pokaż pliki w katalog) kończy się niepowodzeniem, gdy zaś nazwy plików obejmiemy cudzysłowami wydanie komendy kończy się sukcesem.
W przypadku pliku, zaczynającego się od minusa objęcie nazwy pliku cudzysłowem nie wystarczy, gdyż w poleceniu, w którym do takiego pliku będziemy próbowali się odwołać uzyskamy informację o błędnej opcji. Prawidłowo zbudowana komenda, która odwołuje się do pliku, którego nazwa rozpoczyna się od znaku: – (minus) musi zostać poprzedzona operatorem: ./
Operatory przekierowania
Każde polecenie a raczej wynik wydania komendy można zapisać do pliku. Przypuśćmy, że okresowo badasz dostępność jakiegoś hosta i wyniki te chcemy zapisać w zewnętrznym pliku. Aby zadanie udało się wykonać należy użyć symbolu przekierowania. Są trzy główne symbole przekierowania:>,>> oraz <
Aby zrozumieć sposób ich działania symbole >,>>, połączymy z poleceniem ping, które będzie skanować adres 8.8.8.8
Po wydaniu polecenia: ping -c 3 8.8.8.8 > test_google w terminalu nie zostaną pokazane żadne informacje, gdyż zostają one przekierowane do pliku test_google.
Użycie polecenia jeszcze raz spowoduje nadpisanie (zastąpienie) już istniejących danych, aby wymusić dopisanie do już istniejącego pliku należy użyć symbolu >> – np. ping -c 3 8.8.8.8 >> test_google
Operator przekazania > można również użyć do przekazania wyników polecenia do innego terminala.
Aby przekazanie się powiodło musimy poznać identyfikator terminala, w którym mają one zostać wyświetlone. Nazwę poznasz po wydaniu polecenia: tty
Mając otwarte różne sesje konsoli przy użyciu jej identyfikatora możemy przekierowywać wyniki wydawanych poleceń. Poniżej przykład przekierowania wyników po wydaniu komendy ifconfig – polecenie: ifconfig > /dev/pts/25
Użyte polecenia przekierowania > oraz >> wymuszały zapisanie wyników wydanych poleceń do pliku, natomiast symbol < działa odwrotnie – pobiera dane z istniejącego pliku.
Poniżej przykład pobrania wyrazów z pliku dane wraz z ułożeniem ich w kolejności alfabetycznej. Dane pobrane z zewnętrznego pliku dzięki użyciu polecenia sort zostają ułożone w kolejności rosnącej tj. od a do z.
Oczywiście nic nie stoi na przeszkodzie, aby w poleceniu użyć wielu symbolów przekierowania. Spróbujmy posortowane wyrazy z przykładu przedstawionego powyżej zapisać do pliku. Zadanie to wykonamy za pomocą komendy: sort < dane > posortowane
Istnieje jeszcze jeden symbol, to pionowa kreska (Shift+”\”). Symbol ten pozwala na utworzenie tzw. potoku (ang. pipe). Potok pozwala nam na łączenie ze sobą kilku poleceń tak by stanowiły one jedność bądź bardziej fachowo, aby dane wyjściowe jednego programu były danymi wejściowymi dla innego.
Sztandarowym przykładem użycia potoku jest sytuacja, w której wydajemy polecenie a informacje, które dzięki niemu uzyskujemy nie mieszczą się w oknie terminala. Informacji jest tak dużo, że kolejna porcja wypisywanych danych zastępuje te bieżące a my nie mamy możliwości przeczytania ich. Natomiast gdy wydamy np. komendę: ls -l | more wyniki uzyskane dzięki poleceniu ls (pokaż pliki w katalogu) zostaną przekazane do aplikacji more powodującej zatrzymanie wyświetlania po zapełnieniu ekranu terminala. Kolejna porcja informacji zostanie wyświetlona po wciśnięciu dowolnego klawisza. Wydane polecenie: ls -l | more zostało zbudowane z dwóch odrębnych komend a połączonych ze sobą operatorem potoku.
Operatory przekierowania i operator potoku można łączyć tak naprawdę z wszystkimi poleceniami używanymi w powłoce wszystko zależy od celu jaki chcemy osiągnąć. Poniżej jeszcze dwa przykłady, w których wykorzystano te operatory.
Pierwszy w pliku tekstowym zapisuje nazwy plików (w kolejności alfabetycznej) znajdujących się w danym katalogu (w przykładzie użyto katalog: /bin/ – polecenie: ls /bin/ | sort > pliki)
Drugi zaś wyszukuje wszystkie pliki z rozszerzeniem jpg a wyniki wraz z sortowaniem zostają zapisane do pliku – polecenie: find / -name *.jpg | sort > zdjęcia
Jak w gąszczu informacji odnaleźć tę szukaną? czyli grep
Polecenie: grep jest wykorzystywane do odszukania danej wartości lub danych które będą pasować do wzorca. Ogólna składnia polecenia jest następująca: grep <opcje> <wzorzec> <przeszukiwany_plik>
Poniżej został utworzony plik, który zawiera listę załadowanych modułów i w pliku tym poszukujemy informacji na temat modułu Bluetooth. Po wydaniu polecenia: grep Bluetooth plik3 które przeszukuje plik o nazwie plik3 pod kątem wystąpienia słowa Bluetooth nie uzyskujemy żadnej informacji, gdyż szukany ciąg w nim nie występuje. A może problemem jest wielkość liter? Aby zweryfikować tę tezę w następnym poleceniu została dodana flaga: -i która sprawia, że narzędzie grep nie będzie zwracało uwagi na wielkość liter. Szukany ciąg został odnaleziony.
Wzorce poszukiwanych ciągów tekstowych możemy budować w zależności od kryteriów jakie muszą spełniać. Poniżej na rysunku wzorzec, który każe wyszukać ciągi znaków, w których znajdują się litery xyz – polecenie: grep [xyz] plik3
Jeszcze jeden przykład, który szuka tekstu: snd_ przy czym tekst ten musi wystąpić a po nim może znajdować się dowolna mała litera od a do z – polecenie: grep snd_[a-z] plik3
Można by podać wiele przykładów użycia polecenia grep, lecz wszystko sprowadza się do tego co chcemy odszukać. Poniżej kilka wyrażeń, które pozwolą Ci na budowę kryteriów (jeśli znasz regexp jesteś w „domu” :-)), przeszukujących plik pod kątem twoich oczekiwań:
- [xyz] – pasuje do x lub do y lub do z,
- [a-z] – pasuje do wszystkich liter od a do z
- [A-Za-z] – pasuje do dowolnej dużej i małej litery,
- [0-9] – pasuje do dowolnej z cyfr,
- [^xy] – pasuje do wszystkich znaków z wyjątkiem x i y,
- . – dowolny znak,
- ^ – pusty łańcuch na początku linii,
- $ – pusty łańcuch na końcu linii,
- \< – pusty łańcuch na początku słowa,
- \> – pusty łańcuch na końcu słowa.
- Oprócz wyrażeń do dyspozycji mamy również opcje:
- -i – zignoruj wielkość liter,
- -v – wypisz te wiersze, które nie pasują do zbudowanego wzorca,
- -f – porównaj wiersze wg wzorców zapisanych w pliku,
- -c – zwróć liczbę wierszy pasujących do wzorca,
- -n – wypisz numer wiersza, w którym zostało odnalezione dopasowanie,
- -l – wypisz tylko nazwy plików, w których znajduje się poszukiwany tekst,
- -w – wyszukuje konkretny ciąg wyrazowy oznacza to, że jeżeli szukany tekst to np. ta to zwrócone zostaną tylko te wartości w których ten tekst wystąpi, nie zostanie zwrócone np. słowo tata
- -r – szukanie rekursywnie tzn. przeszukiwane są również podkatalogi,
- -E – interpretuje wzorzec jako wyrażenie regularne.
Gdy będziesz używać grep pamiętaj, że aby znaleźć wyrazy zawierające następujące znaki: + | { } ( ) ? . to znaki te należy zamaskować (gdyż są wykorzystywane do budowy kryteriów) – maskujemy wykorzystując do tego prawy ukośnik \
To na koniec jeszcze parę przykładów:
grep zdjecie\.jpg plik.txt – gdy w poszukiwanym wyrazie chcemy odnaleźć kropkę wówczas znak kropki musimy zamaskować używając do tego prawego ukośnika, szukany ciąg to: zdjecie.jpg
grep joan*a plik.txt – użycie * oznacza, że poprzedzający gwiazdkę element będzie dopasowany zero lub dowolną ilość razy, wydanie polecenia zwróci tekst: joana a także joanna czy joannna
grep komputer * – polecenie wyszuka wyraz komputer we wszystkich plikach bieżącego katalogu
grep ka$ plik.txt – wyrazy kończące się na ka, czyli np. pralka, walka itd.
grep -E „^a|^b” plik.txt – zostaną wybrane wiersze zaczynające się znakiem a lub b (znak | oznacza lub)