HOWTO Unix Terminal (Część czwarta)

Posted on Mon 19 August 2019 in unix-terminal

W tej części umówimy komendy proste, podstawowe oraz zaawansowane.

5. Podstawowe komendy do pracy z plikami/folderami

ls

ls = LisT Wyświetla pliki w folderze. Po prostu.

$ ls  # wyswietla aktualny listę plików w folderze w którym się znajduje
 2019-07-29.jpg                    krs-hackerspace.pdf
 2019-09-25.jpg                    lecture.pdf
$ ls gimp  # wyswietla folder gimp
IMG_20180408_234932.dng  IMG_20180411_191031.dng  VID_20180317_155713.mp4
IMG_20180411_190933.dng  IMG_20180414_160945.dng  VID_20180317_163447.mp4
$ ls -la # wyświetla wszystkie pliki (również ukryte) `-a jako --all` w postaci długiej listy `-l`
total 3977296
drwxr-xr-x  167 firemark firemark     139264 paź  3 22:50  .
drwxr-xr-x    4 root     root           4096 kwi 24  2018  ..
-rw-rw-r--    1 firemark firemark    1343287 lip 29 22:57  2019-07-29.jpg
-rw-rw-r--    1 firemark firemark      26029 wrz 25 21:31  2019-09-25.jpg
$ ls -thor
# w postaci długiej listy bez grup `-o`
# posortowane po czasie w odwrotnej kolejnosci
# `-tr` oraz ludzkie formaty wielkości plików `-h jako --human-readable`
total 3,8G
-rw-r--r--  1 firemark 3,8G lis 26  2014  win7.ova
drwxr-xr-x  6 firemark 4,0K cze 17  2015  Slic3r
drwx------  3 firemark 4,0K paź 30  2015  Library

pwd

wyświetla w którym aktualnie folderze jesteśmy.

$ pwd
/home/user/

cd

cd = Change Directory przeskaskuje do danego folderu w terminalu. Brak argumentu przeskakuje do folderu domowego

$ cd folder
$ pwd
/home/user/folder

touch

"Dotyka" plik, zmieniając mu czas na "teraz". Jeżeli pliku nie ma to tworzy pusty.

$ touch plik  # tworzy plik

mkdir

mkdir = MaKe DIRectory

Tworzy folder. Po prostu. Naprawdę.

$ mkdir folder  # tworzy folder

cat

Wyświetla podany plik - N argumentów wyświetla N plików.

rm

rm = ReMove. Kasuje plik/foldery

$ rm plik
$ rm *.png -f  # kasuje N plików bez pytania się o każdy plik
$ rm folder -rf  # rekurencyjnie kasuje pliki z folderu oraz sam folder

mv

mv = MoVe. Przesuwa folder/plik

$ mv x y  # przesuwa plik/folder x do y (zmienia nazwę)
$ mv plik folder/  # przesuwa plik do folderu folder
# mv *.png folder/  # przesuwa wszystkie pliki do folderu folder

cp

cp = CoPy. Kopiuje pliki oraz foldery

$ cp x y  # kopiuje plik x do y
$ cp plik folder/  # kopiuje plik x do folderu folder
$ cp *.png folder/  # kopiuje pliki do folderu folder
# cp folder1 folder2 -r  # kopiuje folder folder1 do folder2 rekurencyjnie (z całą zawartością)

wc

wc = Word Count. Wyświetla statystyki pliku - linijki, znaki etc.

$ wc -l duzy_plik maly_deszcz # wyswietla ile lin posiadają pliki
300 duzy_plik
  5 maly_deszcz

find

wyszukuje pliki oraz foldery rekurencyjnie. Find ma swój syntax co do argumentów - warto przejrzeć jego manual.

$ find folder  # znajduje wszystkie pliki w tym folderze i kolejnych
$ find folder -type f  # znajduje tylko pliki, bez folderów
$ find folder -type d  # znajduje tylko foldery
$ find -iname 'name.txt'  # szuka czy istnieja pliki o nazwie name.txt
$ find -iname 'name*'  # szuka czy istnieją pliki o nazwie 'name' na początku

Możemy łączyć kilka zapytań w jedno:

$ find -iname '*.txt' -or -iname '*.png'  # wyszukaj pliki txt lub png
$ find -iname 'sebastian' -and -type d  # wyszukaj foldery o nazwie sebastian

Pozwala też kasować pliki:

$ find -iname '*.js' -delete

Dla każdego wyszukanego pliku możemy uruchomić jakąś komendę przy użyciu xargs:

$ find -iname '*.py'
./foo.py
./bar.py
./foo/foo.py
$ find -iname '*.py' | xargs wc -l  # uruchamia wc -l ./foo.py; wc -l ./bar.py; etc
100 ./foo.py
200 ./bar.py
300 ./foo/foo.py

du

du = Disk Usage. Sprawdza wielkość plików w danym folderze lub zaznaczoe pliki.

$ du Desktop   # sprawdza wielkosc folderu
758980  Desktop
$ du -h Desktop  # sprawdza wielkosc folderu i podaje "ludzkie" jednostki (-h = human)
742M    Desktop
$ du -cha Library/VirtualBox  # -c = count; -a = all
8.0K    Library/VirtualBox/VDI/.DS_Store
1.6G    Library/VirtualBox/VDI/xubuntu-6.06.1-x86.vdi
1.6G    Library/VirtualBox/VDI
4.0K    Library/VirtualBox/Machines/xubuntu-6.06.1-x86/xubuntu-6.06.1-x86.xml
8.0K    Library/VirtualBox/Machines/xubuntu-6.06.1-x86
12K     Library/VirtualBox/Machines
1.6G    Library/VirtualBox
1.6G    total

dd

dd = Copy Copy bo na cc już brakło miejsca dlatego przesuneli się na kolejną literkę. Porąbane co nie?

Kopiuje zawartość pliku A (wirtualnego lub zwykłego) do pliku B. Przypommina ze plikami może być pendrive, dysk, partycja, płyta cd. Kopię systemu możemy zapisać do 1 pliku, to jest kurde fajne!

$ dd if=PLIK_A of=PLIK_B  # skopiowanie całego pliku PLIK_A do pliku PLIK_B
$ dd if=PLIK_A of=PLIK_B bs=N count=M  # skopiowanie M chunków (chunk = "Kawałek" czy grupa bajtów) wielkości N bajtów (czyli N*M bajtów)
$ dd if=PLIK_A of=PLIK_B bs=1K count=100  # skopiowanie 100kB danych
$ dd if=PLIK_A of=PLIK_B status=progress  # wyswietla ile skopiowal danych i z jaka predkoscia caly czas

mc

Taki total commander w terminalu ale nie jesteś hakerem po to by korzystać z takich narzędzi ;-)

6. Podstawowe ekrany do pracy z terminalem

history

Wyświetla historię komend. Fajna sprawa.

watch

Często się przydaje gdy dany proces działa w tle i coś wykonuje - watch uruchamia co N sekund podaną przez nas komendę.

$ watch -n2 ls
# co 2 sekundy będzie uruchamiał komendę ls i będzie wyświetlał jakie są aktualne pliki w tym folderze
# przydaje się bardzo gdy mamy skrypt który generuje masę plikóww dłuższym czasie

reset

"Resetuje" ekran - czasami po otwarciu pliki zdarza się, że na ekranie zostają śmieci które psują nawet pisanie. reset rozwiązuje problem

clear

Czyści ekran - pokaże się tylko PROMPT po jej wpisaniu.

ps

Pokazuje działające procesy w systemie.

$ ps u  # procesy włączone tylko przez usera
$ ps x  # procesy włączone poza aktualnym terminalem
$ ps a  # procesy innych userów (np. root czy www-data)
$ ps aux  # wszystko naraz!!!

htop

zarządza procesami w systemie - nie jest to domyślna aplikacja ale bardzo wspomaga życie.

7. Podstawowe komendy do pracy z tekstem

echo

Wyświetla tekst z argumentu na ekranie. Często stosowane by wyświetlić stringa z zmiennymi:

$ echo test
test
$ echo elo $PWD
elo /home/user

more

Fajna komenda - jak masz dużo tekstu z wyniku komendy (np. 300 linijek) i chcesz wszystko przejrzeć to możesz to przyda ci sie komenda more (pozwala na przewijanie linii krok po kroku)

  • Enter - przewija linijkę
  • Spacja - przewija cały tekst
$ cat duzy_plik | more

less

Świetna komenda do czytania logów czy dużych plików - wczytuje tyle ile powinnien (a nie jak inne edytory, wczytują cały plik), co się bardzo przydaje gdy plik ma kilka GB.

Poza tym posiada wyszukiwarkę (uaktywnia się klawiszem / oraz ? jak chcemy szukać w drugą stronę) oraz pozwala na wyświetlanie tylko linijek które pasują do wyrażenia (znak &)

Obie funkcje przyjmują wyrażenia regularne (sam sobie poszukaj dokumentacji!)

Pokazuje 10 (domyślnie) linijek z wyniku/pliku. Przydaje się gdy chcesz zobaczyć początek. Komenda też przerywa program z którego odczytuje (no bo i tak wiecej nie wyświetli)

$ cat duzy_plik | head  # pokazuje 10 linijek
$ cat duzy_plik | head -n20  # pokazuje 20 linijek
$ head -n20 duzy_plik  # to samo co wyzej bez pipe

tail

To samo co head tylko na odwrót - pokazuje ostatnie linijki.

$ cat duzy_plik | tail  # pokazuje 10 ostatnich linijek
$ cat duzy_plik | tail -n20  # pokazuje 20 ostatnich linijek

można też "nasłuchiwać" w tak zwanym trybie follow:

$ tail -f 2018-01-01.log  #  nasluchuje zmiany w pliku - jak dojdą nowe linijki, tail je wyświetli
$ dlugo_dzialajacy_program_naprawde | tail -f  # nasluchuje ostatnie zmiany z komendy

wc

Bardzo pomaga policzyć ilośc linijek z STDOUT.

$ ls folder | wc -l  # wyswietla ile było plików (linijek w STDOUT)

cut

Wycina odpowiednie kawałki w linijce. Super narzędzionko

$ head -n5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
$ head -n5 /etc/passwd | cut -d: -f7   # dla podziału znaku ':' wybiera 7 słowo
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync

sort

Sortuje wyniki. Bardzo fajny program.

# rozszerzony przykład z cut
$ head -n5 /etc/passwd | cut -d: -f7 | sort
/bin/bash
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin

# mozemy też sortować wyniki z du
$ du -h Library/* | sort -hr  # -h = human; -r = reverse
1.6G    Library/VirtualBox/VDI
1.6G    Library/VirtualBox
12K     Library/VirtualBox/Machines
8.0K    Library/VirtualBox/Machines/xubuntu-6.06.1-x86

uniq

Zlicza takie same linijki. Tylko pamiętaj - linijki muszą być obok siebie!

# rozszerzony przykład z cut
$ head -n10 /etc/passwd | cut -d: -f7 | uniq
/bin/bash
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin

# sprobójmy posortować
$ head -n10 /etc/passwd | cut -d: -f7 | sort | uniq
/bin/bash
/bin/sync
/usr/sbin/nologin

# możemy też zliczać wystąpienia
$ cat /etc/passwd | cut -d: -f7 | sort | uniq -c
      2 /bin/bash
      5 /bin/false
      1 /bin/sync
      1 /sbin/nologin
     33 /usr/sbin/nologin

# ... oraz posortować ponownie
$ cat /etc/passwd | cut -d: -f7 | sort | uniq -c | sort -n  # -n = numeric
      1 /bin/sync
      1 /sbin/nologin
      2 /bin/bash
      5 /bin/false
     33 /usr/sbin/nologin

grep

najfajniejsza komenda - filtruje linijki z pliku/wyjścia.

$ grep bash /etc/passwd   # pokaz linijki ktore maja w sobie slowo bash
root:x:0:0:root:/root:/bin/bash
user:x:1000:1000:user,,,:/home/user:/bin/bash
$ grep -v bash /etc/passwd  | wc -l  # zlicz ile jest linijek NIE posiadaja slowa bash
40
$ lspci | grep -i audio  # -i = incase
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05)
01:00.1 Audio device: NVIDIA Corporation GK107 HDMI Audio Controller (rev ff)

wyrazenie grep jako argument przyjmuje wyrazenia regularne, więcej na https://www.cyberciti.biz/faq/grep-regular-expressions/

8. Komendy związane z siecią

wget

Ściąga podany plik i zapisuje go w aktualnym folderze.

$ wget https://file-examples.com/wp-content/uploads/2017/02/zip_2MB.zip
# zapisuje w folderze aktualnym plik zip_2MB.zip

ssh

W skrócie - pozwala na łączenie się z innymi maszynami które mają dostęp do protokołu ssh

ssh user@host.pl
# loguje sie do innej maszyny

curl

Robi requesty HTTP na aktualną stronę. Warto przejrzeć jego manual

httpie

Curl na sterydach - gorąco polecam.

9. Konkluzja

W tym artykule zamierzałem pokazać podstawowe elementy poruszania się po terminalu w linuxie oraz podstawowe użycie komend. Często doświadczam u osób początkujących w IT brak wiedzy o terminalu gdzie korzystają go w ostateczności lub unikają go jak ognia korzystając z GUI czy IDE. Zamierzałem też pokazać że terminale nie gryzą i wraz z zrozumieniem jak to wszystko działa daje bardzo potężne narzędzie do pracy z kodem czy "hakowaniem"