Različiti načini čitanja datoteke u Bash skripti koristeći while petlju
Ovaj članak govori o tome kako čitati datoteke u bash skriptama koristeći while petlju. Čitanje datoteke je uobičajena operacija u programiranju. Trebali biste biti upoznati s različitim metodama i koji je metod efikasniji za korištenje. U bash-u, jedan zadatak se može postići na mnogo načina, ali uvijek postoji optimalan način da se zadatak obavi i mi ga trebamo slijediti.
Prije nego što vidite kako čitati sadržaj datoteke koristeći while petlju, kratki uvod o tome kako while petlja funkcionira. Dok petlja procjenjuje uvjet i iterira preko zadanog skupa kodova kada je uvjet istinit.
while [ CONDITION ]
do
code block
done
Hajde da razložimo sintaksu while petlje.
- while petlja bi trebala započeti ključnom riječi while nakon koje slijedi uslov.
- Uslov treba biti priložen unutar [ ] ili [[ ]]. Uvjet uvijek treba vratiti true da bi se petlja izvršila.
- Stvarni blok koda će biti postavljen između done i done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
Ovo je vrlo jednostavan primjer, gdje se petlja izvršava sve dok NUMBER ne bude veći od 10 i ispisuje echo izjavu.
Zajedno sa while koristit ćemo naredbu read za čitanje sadržaja datoteke red po red. Ispod je sintaksa kako se kombinuju naredbe while i read. Sada postoje različiti načini da se datoteka prenese kao ulaz i sve ćemo ih vidjeti.
SYNTAX
while read VARIABLE
do
code
done
Piping u Linuxu
Obično ćemo koristiti naredbu cat za pregled sadržaja datoteke s terminala. Također, prenijet ćemo izlaz cat komande na druge komande kao što su grep, sort, itd.
Slično, ovdje ćemo koristiti cat komandu da pročitamo sadržaj datoteke i uputimo ga u while petlju. Za demonstraciju, koristim datoteku /etc/passwd, ali nije preporučljivo petljati se sa ovom datotekom pa uzmite rezervnu kopiju ove datoteke i igrajte se s njom ako želite.
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Hajde da razjasnimo šta će se dogoditi kada se podnese gornji kod.
- cat /etc/passwd će pročitati sadržaj fajla i proslediti ga kao ulaz kroz cev.
- Komanda read čita svaki red koji je proslijeđen kao ulaz iz cat komande i pohranjuje ga u varijablu LREAD.
- Komanda read će čitati sadržaj datoteke dok se EOL ne protumači.
Također možete koristiti druge komande poput head, tail i pipe it to while petlju.
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Preusmjeravanje unosa u Linuxu
Možemo preusmjeriti sadržaj datoteke u while petlju koristeći operator preusmjeravanja ulaza (<)
.
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
Također možete pohraniti ime datoteke u promjenljivu i proći ga kroz operator preusmjeravanja.
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
Također možete proslijediti imena datoteka kao argument vašoj skripti.
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
Interni separator polja
Možete raditi s različitim tipovima formata datoteka (CSV, TXT, JSON) i možda ćete htjeti podijeliti sadržaj datoteke na osnovu prilagođeni graničnik. U ovom slučaju, možete koristiti “Interni separator polja (IFS)” da podijelite sadržaj datoteke i pohranite ga u varijablama.
Dozvolite mi da vam pokažem kako to funkcionira. Pogledajte datoteku /etc/passwd koja ima dvotočku (:)
kao graničnik. Sada možete odvojiti svaku riječ iz reda i pohraniti je u zasebnu varijablu.
U primjeru ispod, dijelim datoteku /etc/passwd sa dvotočkom kao mojim separatorom i pohranjujem svaku podjelu u različite varijable.
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
Prikazao sam samo jednu liniju podijeljenu na gornjoj slici s obzirom na veličinu snimka ekrana.
Prazne linije u Linuxu
Prazne linije se ne zanemaruju kada petljate kroz sadržaj datoteke. Da bih to pokazao, kreirao sam uzorak datoteke sa sadržajem ispod. Postoje 4 reda i nekoliko praznih redova, vodeći razmak, prazni razmak na kraju, znakovi tabulatora u redu 2 i neki izlazni znakovi (\n i \t).
while read LREAD
do
echo ${LREAD}
done < testfile
Pogledajte rezultat, prazan red se ne zanemaruje. Također, zanimljiva stvar koju treba primijetiti je kako se prazni prostori skraćuju naredbom read. Jednostavan način da zanemarite prazne redove prilikom čitanja sadržaja datoteke je korištenje test operatora sa zastavicom -z
koja provjerava da li je dužina stringa nula. Sada ponovimo isti primjer, ali ovaj put sa test operatorom.
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
Sada iz izlaza možete vidjeti da su prazne linije zanemarene.
Escape Characters
Escape znakovi kao što su \n
, \t
, \c
neće biti ispisani prilikom čitanja datoteke. Da bih to pokazao, koristim isti uzorak datoteke koja ima nekoliko izlaznih znakova.
while read LREAD
do
echo ${LREAD}
done < testfile
Iz izlaznih izlaznih znakova možete vidjeti da su escape znakovi izgubili svoje značenje i samo su n i t ispisani umjesto \n
i \t
. Možete koristiti -r
da spriječite tumačenje obrnute kose crte.
while read -r LREAD
do
echo ${LREAD}
done < testfile
To je to za ovaj članak. Voljeli bismo čuti od vas ako imate povratnih informacija ili savjeta. Vaše povratne informacije su ono što nam pomaže da kreiramo bolji sadržaj. Nastavite čitati i podržavajte.