Linux podstawowe polecenia

Omówienie podstawowych poleceń systemu Linux oraz przykładowe ćwiczenia.

Podstawowe polecenia - krótki wstęp

ls [opcje] [nazwa_katalogu] - wyświetla zawartość katalogu
ls -a - wszystkie pliki nawet ukryte
ls -l - format długi.
Przykłady:
ls /nazwa_katalogu
ls -al /etc
pwd - katalog bieżący
cd [opcje] nazwa_katalogu - zmiana katalogu, np.:
cd /home - zmienia katalog bieżący na katalog /home
cd ~ - zmienia katalog bieżący na katalog domowy użytkownika
cd .. - zmienia katalog bieżący na katalog bezpośrednio nadrzędny.
mkdir [opcje] nazwa_katalogu - tworzenie katalogu, np.:
mkdir ./test - utworzenie katalogu test w katalogu bieżącym
mkdir ../test - utworzenie katalogu test w katalogu bezpośrednio nadrzędnym.
rmdir [opcje] nazwa_katalogu - usuwanie katalogu, np.:
rmdir ~/test - usunięcie katalogu test z katalogu domowego
rmdir ./test - usunięcie katalogu test z katalogu bieżącego.
Dla poleceń rmdir i mkdir opcja -p, pozwala odpowiednio, usuwać i tworzyć struktury katalogów, np.:
rmdir -p abc/def/ghi - usunie katalogi ghi, def oraz abc, które tworzyły hierarchię.
cp [opcje] nazwa_pliku nowa_nazwa_lub_katalog - kopiowanie pliku określonego przez pierwszy argument pod nazwę lub do katalogu określonego drugim argumentem, np.:
cp abc.txt xyz.txt - kopiuje plik abc.txt pod nową nazwę xyz.txt w katalogu bieżącym
cp /etc/abc.txt ~ - kopiuje plik abc.txt z katalogu /etc do katalogu domowego użytkownika
cp -r - kopiowanie struktury katalogów
rm [opcje] lista_plików - usuwanie plików podanych jako argumenty wywołania, np.:
rm abc.txt xyz.txt - usuwa pliki abc.txt i xyz.txt w katalogu bieżącym
rm /home/test.txt - usuwa plik test.txt z katalogu /home
rm -r - służy do usuwania struktur katalogów.
mv [opcje] nazwa_pliku nowa_nazwa - zmiana nazwy pliku określonego pierwszym argumentem na nazwę określoną drugim argumentem. Jeśli drugi argument wywołania jest katalogiem, to wówczas plik zostanie przeniesiony do tego katalogu, np.:
mv abc.txt xyz.txt - zmiana nazwy pliku abc.txt na nazwę xyz.txt w katalogu bieżącym
mv /home/abc.txt ~ - przeniesienie pliku abc.txt z katalogu /home do katalogu domowego użytkownika.
touch [opcje] nazwa_pliku - modyfikuje informacje na temat czasów modyfikacji i odczytu pliku, ale pozwala także na utworzenie nowego pliku, np.:
touch test.txt - utworzenie (pustego) pliku test.txt w katalogu bieżącym.

Metaznaki

* - zastępuje dowolny ciąg znaków (także pusty)
? - zastępuje dokładnie jeden dowolny znak
[] - zastępuje dokładnie jeden znak z podanego zakresu, np.: [abc]
[^] - znak ^ na początku oznacza dopełnienie zbioru, czyli dla przykładu [^abc], oznacza dowolny znak nie będący literą a, b i c.
Przykład:
cp ./*.html /test - kopiowanie wszystkich plików z rozszerzeniem .html z katalogu bieżącego do katalogu test
Przeszukiwanie struktury katalogów (wraz z podkatalogami) systemu w poszukiwaniu plików (i katalogów) można zrealizować stosując polecenie:
find katalog kryteria
Najważniejsze opcje:
-name - pozycje o podanej nazwie (można także stosować metaznaki) - rozróżniana jest jednak wielkość liter
-iname - pozycje o podanej nazwie (można także stosować metaznaki) - brak rozróżniania wielkości liter
-size - pozycje o określonym rozmiarze - możliwe są następujące określenia jednostek: c - bajty, k - kilobajty, w - dwubajtowe słowa, brak jednostki oznacza 512-bajtowe bloki; przed rozmiarem można podać znaki + lub -, oznaczają one wówczas odpowiednio: pozycje o rozmiarze większym/mniejszym niż podany
-atime - pozycje, na których była wykonywana jakaś operacja podaną liczbę dni temu; przed ilością dni można podać znaki + lub -, oznaczają one wówczas odpowiednio: pozycje, na których była wykonywana jakaś operacja więcej/mniej dni temu
-mtime - pozycje, na które były modyfikowane podaną liczbę dni temu; przed ilością dni można podać znaki + lub -, oznaczają one wówczas odpowiednio: pozycje, na które były modyfikowane więcej/mniej dni temu
-ctime - pozycje, których i-węzeł był modyfikowany podaną liczbę dni temu; przed ilością dni można podać znaki + lub -, oznaczają one wówczas odpowiednio: pozycje, których i-węzeł był modyfikowany więcej/mniej dni temu
-type - określenie jakie pozycje mają zostać odnalezione: f - pliki zwykłe, d - katalogi, l - dowiązania symboliczne, c - urządzenia znakowe (niebuforowane), b - urządzenia blokowe (buforowane), p - kolejki FIFO
-exec [{}] \; - wykonuje dowolne polecenie; polecenie może zostać wykonane na odszukanych pozycjach - wówczas należy zastosować jako argument polecenia znaki {}.
Przykłady użycia find:
find /mnt/Muzyka -iname '*Madonna*' – przeszuka katalog /mnt/Muzyka (i jego ewentualne podkatalogi) i jeśli natrafi na plik, który w nazwie posiada wyraz „madonna” (wielkość liter nie ma znaczenia) to wyświetli jego nazwę wraz ze względną ścieżką dostępu
find /mnt/Muzyka ! -name '*Madonna*' – przeszuka katalog i wyświetli nazwy plików, które nie mają w sobie nazwy „Madonna” (wielkość liter ma znaczenie)
find . -name 'dane.*' – wyszukiwanie pliku o nazwie dane.* w katalogu bieżącym i w jego podkatalogach
find / -name 'dane.*' – wyszukiwanie pliku o nazwie dane.* zaczynając od katalogu głównego
find /katalog/ -user osoba -type d – poszukiwanie podkatalogów w katalogu /katalog należących do użytkownika osoba

head - wypisuje 10 pierwszych linii z pliku lub standardowego wejścia
head test.txt
head -5 test.txt - wypisze 5 pierwszych linii
tail - wypisuje 10 ostatnich linii z pliku lub standardowego wejścia

cat plik.txt - wyświetli zawartość pliku plik.txt na ekranie

wc plik - liczy liczbę linii/słów/znaków w pliku
wc -l plik.txt - ilość linii w pliku plik.txt
wc -w plik.txt - ilość słów w pliku plik.txt

clear - polecenie czyści ekran konsoli

grep - przeszukuje pliki w poszukiwaniu określonych słów lub wzorców
grep 'test' plik.txt - szuka słowa test w pliku plik.txt
grep -i 'test' plik.txt - jak wyżej, niewarażliwość na wielkość liter
grep 'test' plik.txt plik2.txt - szuka słowa test w plikach plik.txt i plik2.txt
grep -v 'test' plik.txt - wyświetli te linie, które nie zawierają w sobie słowa test
cat plik.txt | grep 'test' - można też grepować wyjście polecenia
grep -r 'test' /etc/ - przeszukiwanie rekursywne (wraz z podkatalogami)
grep -w 'test' plik.txt - dopasowanie co do słowa tzn. znajdzie wyłącznie słowa test, a nie np. test123, atest
egrep -w 'slowo1|slowo2' plik.txt - szukanie dwóch różnych słów
grep -c 'test' plik.txt - zwróci liczbę wystąpień
grep -n 'test' plik.txt - każda linia wyniku zostanie poprzedzona numerem linii

Krótko o przekierowaniu wejścia/wyjścia i potokach

polecenie > plik - przekierowanie standardowego wyjścia do pliku (zastąpienie danych w pliku)
polecenie >> plik - dołącza standardowe wyjście do pliku
polecenie < plik - standardowe wejście z pliku
polecenie1 | polecenie2 - tzw. potok - wyjście polecenia polecenie1 przekazujemy do wejścia polecenia polecenie2
cat plik1 plik2 > plik3 - złączenie plik1 i plik2 przekazuje do pliku3
Przykłady:
who | sort - sortuje wynik polecenia who
who > wynik.txt - przekazuje wyjście polecenia who do pliku wynik.txt
sort < plik.txt - tu z kolei do polecenia sort przekazujemy dane wejściowe z pliku

Różne ćwiczenia

1. Wypisać z pliku passwd linie odpowiadające wszystkim użytkownikom o imieniu Anna, posortowane malejąco wg numeru użytkownika.
cat passwdtest | grep Anna | sort -t: -k3,3 -nr
2. Wypisać z pliku passwd imiona, nazwiska i loginy wszystkich użytkowników o imieniu Mariusz, posortowanych alfabetycznie (wg nazwisk).
cut -d: -f1,5 passwdtest | grep Mariusz | sort -t: -k2,2
3. Policzyć pliki (bez katalogów) w swoim katalogu domowym (maxdepth po to aby nie szukało w podkatalogach).
find ~ -maxdepth 1 -type f 2>/dev/null | wc -l
4. Znaleźć w systemie pliki, których jest się właścicielem, a ich nazwy zaczynają się na p lub P, skopiować je do utworzonego wcześniej katalogu pliki-na-p.
find / -user gosia -name "[pP]*" -type f
Utworzenie katalogu pliki-na-p:
mkdir pliki-na-p
find ~ -user gosia -name "[pP]*" -type f -exec cp {} ~/pliki-na-p/ \;
find ~ -maxdepth 1 -user gosia -name "[pP]*" -type f -exec cp {} ~/pliki-na-p/ \;
5. Wyszukać w katalogu /etc i jego podkatalogach pliki o nazwach zaczynających się na literę h, utworzyć do nich linki symboliczne w utworzonym wcześniej katalogu ~/moje_linki.
ln -s - tworzenie dowiązania symbolicznego
mkdir moje_linki
find /etc -name 'h*' -type f -exec ln -s {} ~/moje_linki \;
lub
find /etc -name 'h*' -type f 2>/dev/null -exec ln -s {} ~/moje_linki \;
6. Wypisać wszystkie pliki ze swojego katalogu domowego uporządkowane od najnowszych do najstarszych, wynik zapisać do pliku moj.katalog.
ls ~ -t -l - lista plików w katalogu domowym posortowana wg daty modyfikacji (od najnowszych) - w linuxie katalog też jest plikiem
ls -t -l -A - wszystkie pliki nawet ukryte
ls ~ -t -l > moj.katalog
Jeśli chcemy wypisać naprawdę tylko pliki (zwykłe) bez katalogów:
ls ~ -t -l -A | find -maxdepth 1 -type f > moj.katalog
7. Polecenie last -n (gdzie n jest liczbą) wypisuje listę n użytkowników, którzy ostatnio logowali się w systemie. Sprawdzić, ile razy w ciągu ostatnich 500 logowań pojawił się w systemie wybrany użytkownik, wypisać te logowania oraz ich liczbę.
 
last -500 | grep 'gosia' | tee /dev/tty | wc -l
8. Z pliku przyklad wybrać część pomiędzy \begin{abstract} i \end{abstract}, zapisać do pliku przyklad2. Polecenie grep jest jednoliniowe. Użyjemy awk.
cat file | awk '/foo/,/bar/'
cat przyklad.txt | awk '/\\begin{abstract}/,/\\end{abstract}/' > przyklad2.txt
9. W pliku pracownicy zamienić wszystkie litery na duże, wynik zapisać do pliku PRACOWNICY.
cat pracownicy.txt | tr '[:lower:]' '[:upper:]' > PRACOWNICY.txt
10. Z pliku pracownicy wypisać wszystkie osoby będące informatykami, ale nie zajmujące się bazami danych, posortowane wg wieku; wynik umieścić w pliku informatycy.
cat pracownicy.txt | grep informatyk | grep -v 'bazy danych' | sort -k3,3 -n > informatycy.txt
11. Z pliku pracownicy wypisać nauczycieli posortowanych według wieku.
cat pracownicy.txt | grep nauczyciel | sort -k3,3 -n
12. Wypisać z pliku pracownicy linie od 12 do 20.
cat pracownicy.txt | head -n 20 | tail -n 9
9 = 20 - 12 + 1 13. Posortować osoby w pliku passwdtest wg numeru grupy, wynik zapisać w pliku passwdtest.posortowane.grupami
cat passwdtest | sort -t: -k4,4 -n > passwdtest.posortowane.grupami.txt
14. Na podstawie zawartości pliku passwd policzyć użytkowników systemu o imieniu Piotr nie będących pracownikami (tj. nie mających w nazwie katalogu domowego słowa users).
cat passwdtest | grep Piotr | grep -v users | wc -l
15. Wyświetl plik /etc/passwd z podziałem na strony przyjmując, że strona ma 5 linii tekstu
cat /etc/passwd | more -5
16. Korzystając z polecenia cat utwórz plik tekst3, który będzie składał się z zawartości pliku tekst1, ciągu znaków podanego ze standardowego wejścia (klawiatury) i pliku tekst2.
cat tekst1.txt /dev/tty tekst2.txt > tekst3.txt
Wpisujemy tekst aż do naciśnięcia Ctrl + D 17. Wyświetl po 5 pierwszych linii wszystkich plików w katalogu bieżącym w taki sposób, aby nie były wyświetlane ich nazwy.
find . -type f -exec head -n 5 {} \;
18. Wyświetl linie o numerach 3, 4 i 5 z pliku passwdtest
cat passwdtest | head -n 5 | tail -n 3
19. Wyświetl linie o numerach 7, 6 i 5 od końca pliku passwdtest
cat passwdtest | tail -n 7 | head -n 3
20. Wyświetl zawartość pliku test.txt w jednej linii
cat test.txt | tr '\n' ' '
21. Napisać polecenie zliczające sumę znaków z pierwszych pięciu linii pliku test.txt
cat test.txt | head -n 5 | wc -c
22. Wyświetlić listę plików z aktualnego katalogu, zamieniając wszystkie małe litery na duże.
ls | tr [:lower:] [:upper:]
23. Wyświetl listę praw dostępu do plików w aktualnym katalogu, ich rozmiar i nazwę.
ls -l | awk '{print $1,$5,$9}'
24. Wyświetl listę plików w aktualnym katalogu, posortowaną według rozmiaru pliku.
ls -l | sort -k5,5
lub
ls -lrS
25. Podaj liczbę plików każdego użytkownika w systemie (wykorzystaj polecenie find i opcję printf).
find / -printf '%u\n' 2>/dev/null | sort | uniq -c
w katalogu domowym:
find ~ -printf '%u\n' 2>/dev/null | sort | uniq -c
26. Podaj nazwy trzech najmniejszych plików zwykłych w katalogu posortowane wg nazwy.
ls -l | grep "^-" | sort -n -k5,5 | head -n 3 | sort -k9,9
27. Podaj pięciu użytkowników o największej liczbie uruchomionych procesów
ps au | grep -v 'USER' | awk '{print $1}' | sort | uniq -c | head -n 5
28. Wyświetl nazwy tych użytkowników, którzy domyślnie używają innego interpretera niż bash.
cat /etc/passwd | cut -d: -f1,7 | grep -v '/bin/bash' | cut -d: -f1
29. Podaj statystykę używanych komend.
history | tr -s ' ' '\t' | cut -f3 | sort | uniq -c | sort
30. Sprawdź czy któryś z użytkowników jest zalogowany w systemie więcej niż jeden raz.
who | tr -s ' ' '\t' | cut -f1 | sort | uniq -c
Poniżej jeszcze przykład wykorzystania polecenia tee.

polecenie tee

ls > test.txt - przekazanie wyniku polecenia ls do pliku
ls | tee test.txt - przekazanie do pliku i jednoczesne wyświetlenie na ekranie (dzięki tee)
ls | tee test.txt > test2.txt - przekazanie do plików test.txt oraz test2.txt
Ciekawe linki:
grep - ciekawe pytanie z serwisu superuser
tutorial Unix
Głębsze spojrzenie na grep
systemy operacyjne
Spis poleceń użytecznych w codziennej pracy z linuxem