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.