3.2 Lekcija 1
Sertifikat: |
Linux Essentials |
---|---|
Verzija: |
1.6 |
Tema: |
3 Moć komandne linije |
Cilj: |
3.2 Pretraga i ekstrakcija podataka iz datoteka |
Lekcija: |
1 od 2 |
Uvod
U ovom labu ćemo se fokusirati na preusmjeravanje ili prijenos informacija s jednog izvora na drugi uz pomoć specifičnih alata. Komandna linija Linux-a preusmjerava informacije kroz određene standardne kanale. Standardni ulaz (stdin ili kanal 0) komande se smatra tastaturom, a standardni izlaz (stdout ili kanal 1) se smatra ekranom. Postoji i drugi kanal koji je namijenjen za preusmjeravanje izlaza greške (stderr ili kanal 2) komande ili poruka o grešci programa. Ulaz i/ili izlaz se mogu preusmjeriti.
Prilikom izvršavanja komande, ponekad želimo prenijeti određene informacije u komandu ili preusmjeriti izlaz na određenu datoteku. O svakoj od ovih funkcionalnosti biće govora u naredne dvije sekcije.
Ulazno/izlazno preusmjeravanje
U/I preusmjeravanje (eng. input/output redirection) omogućava korisniku da preusmjeri informacije sa ili na komandu koristeći tekstualnu datoteku. Kao što je ranije opisano, standardni ulaz, izlaz i izlaz greške mogu se preusmjeriti, a informacije se mogu uzeti iz tekstualnih datoteka.
Preusmjeravanje standardnog izlaza
Za preusmjeravanje standardnog izlaza na datoteku, umjesto na ekran, trebamo koristiti operator >
iza kojeg slijedi ime datoteke. Ako datoteka ne postoji, kreirat će se nova, u suprotnom će informacije prepisati ili zamijeniti postojeću datoteku.
Da bismo vidjeli sadržaj datoteke koju smo upravo kreirali, možemo koristiti komandu cat
. Ova komanda podrazumjevano prikazuje sadržaj datoteke na ekranu. Pogledajte stranicu priručnika (eng. man page) da saznate više o njegovim funkcijama.
Primjer ispod pokazuje funkcionalnost operatora. U prvom slučaju, kreira se nova datoteka koja sadrži tekst “Hello World!”:
$ echo "Hello World!" > text $ cat text Hello World!
U drugom pozivanju, ista datoteka se prepisuje novim tekstom:
$ echo "Hello!" > text $ cat text Hello!
Ako želimo dodati nove informacije na kraj datoteke, moramo koristiti operator >>
. Ovaj operator također kreira novu datoteku ako ne može pronaći postojeću.
Prvi primjer pokazuje dodavanje teksta. Kao što se može vidjeti, novi tekst je dodan u sljedećem redu:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Drugi primjer prikazuje kreiranje nove datoteke:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Preusmjeravanje standardne greške
Da bi preusmjerio samo poruke o grešci, korisnik će morati koristiti operator 2>
iza kojeg slijedi ime datoteke u koju će greške biti zapisane. Ako datoteka ne postoji, kreirat će se nova, inače će datoteka biti prepisana ili zamjenjena.
Kao što je objašnjeno, kanal za preusmjeravanje standardne greške je kanal 2. Prilikom preusmjeravanja standardne greške, kanal mora biti specificiran, za razliku od drugog standardnog izlaza gdje je kanal 1 postavljen podrazumjevano. Na primjer, sljedeća komanda traži datoteku ili direktorij pod nazivom games
i samo upisuje grešku u datoteku text-error
, dok prikazuje standardni izlaz na ekranu:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Za više informacija o komandi |
Na primjer, sljedeća komanda će se pokrenuti bez grešaka, stoga se u datoteku text-error
neće upisivati nikakve informacije:
$ sort /etc/passwd 2> text-error $ cat text-error
Osim standardnog izlaza, standardna greška se također može dodati datoteci s operatorom 2>>
. Ovo će dodati novu grešku na kraj datoteke. Ako datoteka ne postoji, kreirat će se novi. Prvi primjer pokazuje dodavanje novih informacija u datoteku, dok drugi primjer pokazuje kako komanda kreira novu datoteku u kojoj se ne može pronaći postojeća s istim imenom:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Koristeći ovu vrstu preusmjeravanja, samo poruke o grešci će biti preusmjerene na datoteku, normalan izlaz će biti ispisan na ekranu ili će proći kroz standardni izlaz ili stdout.
Postoji jedna konkretna datoteka koja je tehnički bit bucket (to je datoteka koja prihvaća unos i ne radi ništa s njim): /dev/null
. Možete preusmjeriti sve nebitne informacije koje možda ne želite da budu prikazane ili preusmjerene u važnu datoteku, kao što je prikazano u primjeru ispod:
$ sort /etc 2> /dev/null
Preusmjeravanje standardnog ulaza
Ovaj tip preusmjeravanja se koristi za unos podataka u komandu, iz specificirane datoteke umjesto tastature. U ovom slučaju se koristi ovaj <
operator kao što je prikazano u primjeru:
$ cat < text Hello! Hello to you too!
Preusmjeravanje standardnog unosa se obično koristi ili obavlja s komandama koje ne prihvaćaju argumente datoteke. Komanda tr
je jedna od njih. Ova komanda se može koristiti za prevođenje sadržaja datoteke modificiranjem znakova u datoteci na određene načine, kao što je brisanje bilo kojeg određenog znaka iz datoteke, primjer ispod pokazuje brisanje znaka l
:
$ tr -d "l" < text Heo! Heo to you too!
Za više informacija, pogledajte man stranicu komande tr
.
Here dokumenti
Za razliku od izlaznih preusmjeravanja, operator <<
djeluje na drugačiji način u odnosu na druge operatore. Ovaj ulazni tok se također naziva here dokument. Here dokument predstavlja blok koda ili teksta koji se može preusmjeriti na komandu ili interaktivni program. Različiti tipovi skriptnih jezika, kao što su bash
, sh
i csh
, mogu uzimati ulaz direktno iz komandne linije, bez korištenja tekstualnih datoteka.
Kao što se može vidjeti u primjeru ispod, operator se koristi za unos podataka u komandu, dok riječ iza ne navodi ime datoteke. Riječ se tumači kao graničnik unosa i neće se uzeti u obzir kao sadržaj, stoga je cat
komanda neće prikazati:
$ cat << hello > hey > ola > hello hey ola
Pogledajte man stranicu cat
komande za više informacija.
Kombinacije
Prva kombinacija koju ćemo istražiti kombinuje preusmjeravanje standardnog izlaza i standardnog izlaza greške u istu datoteku. Koriste se &>
i &>>
operatori, operator &
predstavlja kombinaciju kanala 1 (eng.channel 1) i kanala 2 (eng.channel 2). Prvi operator će prepisati ili zamijeniti postojeći sadržaj datoteke, a drugi će dodati nove informacije na kraju datoteke. Oba operatora će omogućiti kreiranje nove datoteke ako ne postoji, baš kao u prethodnim odjeljcima:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Pogledajmo primjer koristeći cut
komandu:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
Komanda cut
izrezuje navedena polja iz ulazne datoteke koristeći opciju -f
, treće polje u našem slučaju. Da bi komanda pronašla polje, potrebno je navesti i graničnik sa opcijom -d
. U našem slučaju graničnik će biti ovaj znak /
.
Da biste saznali nešto više o komandi '`cut`, pogledajte njenu man stranicu.
Cijevi komandne linije
Preusmjeravanje se uglavnom koristi za pohranjivanje rezultata komande, koje treba obraditi drugom komandom. Ova vrsta međuprocesa može postati vrlo zamoran i kompliciran zadatak ako želite da podaci prođu kroz više procesa. Da biste ovo izbjegli, možete povezati komandu direktno preko cijevi (eng.pipes). Drugim riječima, izlaz prve komande automatski postaje ulaz druge komande. Ova veza se ostvaruje korištenjem operatora |
(vertikalna trake):
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
U gornjem primjeru, komanda less
nakon operatora cijevi mijenja način na koji se datoteka prikazuje. Komanda less
prikazuje tekstualnu datoteku omogućavajući korisniku da skroluje gore-dole red u tom trenutku. Komanda less
se takođe podrazumjevano koristi za prikaz man stranica, kao što je diskutovano u prethodnim lekcijama.
Moguće je koristiti više cijevi u isto vrijeme. Međukomande koje primaju ulaz, a zatim ga mijenjaju i proizvode izlaz nazivaju se filteri (eng.filters). Uzmimo komandu ls -l
i pokušajmo izbrojati broj riječi iz prvih 10 redova izlaza. Da bismo to učinili, morat ćemo koristiti komandu head
koja po defaultu prikazuje prvih 10 redova datoteke, a zatim prebrojati riječi pomoću komande wc
:
$ ls -l | head | wc -w 10
Kao što je ranije spomenuto, podrazumjevano, head
prikazuje samo prvih 10 redova navedene tekstualne datoteke. Ovo ponašanje se može izmijeniti korištenjem posebnih opcija. Provjerite man stranicu komande da saznate više.
Postoji još jedna komanda koja prikazuje kraj datoteke: komanda tail
. Podrazumjevano, ova komanda odabire zadnjih 10 redova i prikazuje ih, ali kao i head
broj se također može mijenjati. Za više detalja provjerite tail
man stranicu.
Note
|
Opcija |
Komanda wc
(broj riječi) podrazumjevano broji redove, riječi i bajtove datoteke. Kao što je prikazano u vježbi, opcija -w
uzrokuje da komanda broji samo riječi unutar odabranih redova. Najčešće opcije koje možete koristiti sa ovom komandom su: -l
, koja navodi da komanda broji samo redove, i -c
, koja se koristi za brojanje samo bajtova. Više varijacija i opcija komande, kao i više informacija o wc
mogu se pronaći na man stranici komande.
Vođene vježbe
-
Navedite sadržaj vašeg trenutnog direktorija, uključujući vlasništvo i dozvole, i preusmjerite izlaz na datoteku pod nazivom
contents.txt
unutar vašeg home direktorija. -
Sortirajte sadržaj datoteke
contents.txt
iz vašeg trenutnog direktorija i dodajte ga na kraj nove datoteke pod nazivomcontents-sorted.txt
. -
Prikažite zadnjih 10 redova datoteke
/etc/passwd
i preusmjerite je na novu datoteku u direktorijuDocuments
vašeg korisnika. -
Izbrojite broj riječi unutar datoteke
contents.txt
i dodajte izlaz na kraj datotekefield2.txt
u vašem home direktoriju. Morat ćete koristiti i ulazno i izlazno preusmjeravanje. -
Prikažite prvih 5 redova datoteke
/etc/passwd
i sortirajte izlaz obrnuto po abecednom redu. -
Koristeći prethodno kreiranu datoteku
contents.txt
, prebrojite broj znakova u posljednjih 9 redova. -
Izbrojite broj datoteka pod nazivom
test
unutar direktorija/usr/share
i njegovih poddirektorija. Napomena: svaki izlaz linije iz komandefind
predstavlja datoteku.
Istraživačke vježbe
-
Odaberite drugo polje datoteke
contents.txt
i preusmjerite standardni izlaz i izlaz greške u drugu datoteku pod nazivomfield1.txt
. -
Koristeći operator preusmjeravanja unosa i komandu
tr
, izbrišite crtice (-
) iz datotekecontents.txt
. -
Koja je najveća prednost samo preusmjeravanja grešaka na datoteku?
-
Zamijenite sve ponavljajuće razmake unutar abecedno sortirane datoteke
contents.txt
jednim razmakom. -
U jednoj komandnoj liniji eliminišite razmake koji se ponavljaju (kao što je urađeno u prethodnoj vežbi), izaberite deveto polje i sortirajte ga obrnuto po abecednom redu i bez obzira na velika i mala slova. Koliko ste cijevi morali upotrijebiti?
Sažetak
U ovom labu ste naučili:
-
Tipove preusmjeravanja
-
Kako koristiti operatore preusmjeravanja
-
Kako koristiti cijevi za filtriranje izlaza komande
Komande korištene u ovoj lekciji:
cut
-
Ukloni sekciju iz svake linije datoteke.
cat
-
Prikaži ili konkateniraj datoteku.
find
-
Potraži datoteku u hijerarhiji direktorija.
less
-
Prikaži datoteku, omogućujući korisniku da skroluje po jedan red.
more
-
Prikaži datoteku, po jednu stranicu.
head
-
Prikaži prvih 10 linija datoteke.
tail
-
Prikaži zadnjih 10 linija datoteke
sort
-
Sortiraj datoteke.
wc
-
Broji linije ili redove, riječi ili bajtove datoteke.
Odgovori na vođene vježbe
-
Navedite sadržaj vašeg trenutnog direktorija, uključujući vlasništvo i dozvole, i preusmjerite izlaz na datoteku pod nazivom
contents.txt
unutar vašeg home direktorija.$ ls -l > contents.txt
-
Sortirajte sadržaj datoteke
contents.txt
iz vašeg trenutnog direktorija i dodajte ga na kraj nove datoteke pod nazivomcontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Prikažite zadnjih 10 redova datoteke
/etc/passwd
i preusmjerite je na novu datoteku u direktorijuDocuments
vašeg korisnika.$ tail /etc/passwd > Documents/newfile
-
Izbrojite broj riječi unutar datoteke
contents.txt
i dodajte izlaz na kraj datotekefield2.txt
u vašem home direktoriju. Morat ćete koristiti i ulazno i izlazno preusmjeravanje.$ wc < contents.txt >> field2.txt
-
Prikažite prvih 5 redova datoteke
/etc/passwd
i sortirajte izlaz obrnuto po abecednom redu.$ head -n 5 /etc/passwd | sort -r
-
Koristeći prethodno kreiranu datoteku
contents.txt
, prebrojite broj znakova u posljednjih 9 redova.$ tail -n 9 contents.txt | wc -c 531
-
Izbrojite broj datoteka pod nazivom
test
unutar direktorija/usr/share
i njegovih poddirektorija. Napomena: svaki izlaz linije iz komandefind
predstavlja datoteku.$ find /usr/share -name test | wc -l 125
Odgovori na istraživačke vježbe
-
Odaberite drugo polje datoteke
contents.txt
i preusmjerite standardni izlaz i izlaz greške u drugu datoteku pod nazivomfield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Koristeći operator preusmjeravanja unosa i komandu
tr
, izbrišite crtice (-
) iz datotekecontents.txt
.$ tr -d "-" < contents.txt
-
Koja je najveća prednost samo preusmjeravanja grešaka na datoteku
Samo preusmjeravanje grešaka na datoteku može pomoći u održavanju datoteke evidencija koja se često prati.
-
Zamijenite sve ponavljajuće razmake unutar abecedno sortirane datoteke
contents.txt
jednim razmakom.$ sort contents.txt | tr -s " "
-
U jednoj komandnoj liniji eliminišite razmake koji se ponavljaju (kao što je urađeno u prethodnoj vežbi), izaberite deveto polje i sortirajte ga obrnuto po abecednom redu i bez obzira na velika i mala slova. Koliko ste cijevi morali upotrijebiti?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
Vježba je koristila 3 cijevi, jednu za svaki filter.