Skip to content

Preusmerjanje in ukazi s tokovi

Ko v terminalu poženemo ukaz, mu moramo ponavadi podati nek vhod (input), in želimo, da nekaj izpiše na ekran (output). Poglejmo, kako točno to deluje v Linuxu.

Vsak ukaz (oziroma proces), ki se požene, ima na voljo tri standardne podatkovne tokove (data streams):

  • Standardni vhod stdin ima ID 0. Privzeto je to besedilo, ki ga uporabnik vnese s tipkovnico.

  • Standardni izhod stdout ima ID 1. Privzeto nam ga izpisuje lupina, v kateri smo pognali ukaz.

  • Standardna napaka stderr ima ID 2 in vsebuje podatke o napakah, ki so se zgodile med izvajanjem ukaza. Podobno kot stdout se privzeto izpisuje v lupini.

stdio

Standardni vhod/izhod (STDIO)

Preusmerjanje tokov

Vhod in izhod ukazov lahko nadzorujemo - preusmerjamo ga lahko v datoteke ali druge ukaze.

> - preusmerjanje izhoda

S > preusmerimo izhod ukaza v datoteko: ukaz > datoteka. Če še ni obstajala, jo ustvarimo.

zen@ZENBOOK:~$ echo Hello World! > hello
zen@ZENBOOK:~$ cat hello
Hello World!

Če je datoteka že obstajala in je v njej kaj pisalo, te podatke povozimo in jih nadomestimo z novimi.

zen@ZENBOOK:~$ cat hello
Hello World!
zen@ZENBOOK:~$ echo New Input! > hello
zen@ZENBOOK:~$ cat hello
New Input!

>> - preusmerjanje izhoda z dodajanjem (append)

Če datoteke nočemo povoziti, temveč želimo dodajati besedilo na konec datoteke, uporabimo >> namesto >.

zen@ZENBOOK:~$ echo Newer Input! >> hello
zen@ZENBOOK:~$ echo Newest Input! >> hello
zen@ZENBOOK:~$ cat hello
New Input!
Newer Input!
Newest Input!

< - preusmerjanje vhoda

S < preusmerimo datoteko v standardni vhod ukaza: ukaz < datoteka. Ne potrebujemo ga pogosto, ker večina ukazov sprejema imena datotek kot parameter.

zen@ZENBOOK:~$ cat < hello
New Input!
Newer Input!
Newest Input!

Preusmeritve lahko seveda kombiniramo, ukaz < vhod > izhod (podobno tudi vse ostale):

zen@ZENBOOK:~$ cat < hello > out
zen@ZENBOOK:~$ cat out
New Input!
Newer Input!
Newest Input!

2> - preusmerjanje standardne napake

Z > in >> smo preusmerjali izhod ukaza, podobno pa lahko preusmerjamo tudi napako: ukaz 2> out. Uporabiti moramo ID 2, da sporočimo, kateri stream želimo preusmeriti. (Podobno bi lahko stdout preusmerjali z 1>, stdin pa z 0<).

zen@ZENBOOK:~$ cat /etc/shadow 2> out
zen@ZENBOOK:~$ cat out
cat: /etc/shadow: Permission denied

Če želimo hkrati preusmeriti izhod in napako (torej oboje, kar ob izvajanju ukaza vidimo v terminalu), uporabimo &>.

zen@ZENBOOK:~$ ls mapa kapa &> out
zen@ZENBOOK:~$ cat out
ls: cannot access 'kapa': No such file or directory
mapa:
datoteka

| - cev (pipe)

Do zdaj smo preusmerjali z datotekami, s | pa posredujemo izhod enega ukaza kot vhod drugega ukaza: ukaz1 | ukaz2.

pipe

Preusmerjanje ukazov

| je izjemno uporabno orodje. Poglejmo si nekaj ukazov, ki so narejeni, da jih uporabljamo s tokovi podatkov.

Ukazi s tokovi

grep

grep je eden najbolj uporabnih ukazov v Linuxu. Deluje podobno kot Ctrl + F - iz vhodnih podatkov izlušči vrstice, ki se ujemajo z vzorcem, druge pa zavrže.

Format: grep [options] pattern [files]

  • options - zastavice, ki spremenijo obnašanje grep-a.

  • pattern - vzorec (regular expression), ki ga iščemo.

  • files - imena datotek, ki jih želimo preiskati

zen@ZENBOOK:~$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

V grep pogosto radi preusmerimo izhod drugih ukazov s |, da se znebimo odvečnih podatkov.

zen@ZENBOOK:~$ ifconfig | grep "inet "
        inet 172.18.252.109  netmask 255.255.240.0  broadcast 172.18.255.255
        inet 127.0.0.1  netmask 255.0.0.0

find

sort

uniq - unique

head, tail

wc - word count

tr - translate

sed - stream editor

awk

tee

cut, paste

Made with ❤️ by DragonSec SI