Različiti načini čitanja datoteke u Bash skripti pomoću while petlje


Ovaj članak govori o tome kako čitati datoteke u bash skriptama pomoću while petlje. Čitanje datoteke je uobičajena operacija u programiranju. Trebali biste biti upoznati s različitim metodama i znati koja je metoda učinkovitija za korištenje. U bashu se jedan zadatak 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 pomoću while petlje, kratki uvod o tome kako while petlja radi. Dok petlja procjenjuje uvjet i ponavlja zadani skup kodova kada je uvjet istinit.

while [ CONDITION ]
do
    code block
done

Razložimo sintaksu while petlje.

  • while petlja trebala bi započeti ključnom riječi while nakon koje slijedi uvjet.
  • Uvjet treba biti priložen unutar [ ] ili [[ ]]. Uvjet bi uvijek trebao vratiti true da bi se petlja izvršila.
  • Stvarni blok koda bit će postavljen između do 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 dok NUMBER nije veći od 10 i ispisuje naredbu echo.

Zajedno s while koristit ćemo naredbu read za čitanje sadržaja datoteke red po red. Ispod je sintaksa načina na koji se kombiniraju naredbe while i read. Sada postoje različiti načini prosljeđivanja datoteke kao ulaza i vidjet ćemo ih sve.

SYNTAX
while read VARIABLE
do
    code
done

Cjevovod u Linuxu

Obično ćemo koristiti naredbu cat za pregled sadržaja datoteke s terminala. Također, isporučit ćemo izlaz naredbe cat drugim naredbama kao što su grep, sort itd.

Slično, ovdje ćemo upotrijebiti cat naredbu za čitanje sadržaja datoteke i slanje u while petlju. Za demonstraciju koristim datoteku /etc/passwd ali nije preporučljivo petljati s ovom datotekom pa uzmite sigurnosnu kopiju ove datoteke i igrajte se s njom ako želite.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Razjasnimo što će se dogoditi kada se gornji kod pošalje.

  • cat /etc/passwd će pročitati sadržaj datoteke i proslijediti ga kao ulaz kroz cjevovod.
  • Naredba read čita svaki redak proslijeđen kao unos iz naredbe cat i pohranjuje ga u varijablu LREAD.
  • Naredba read čitat će sadržaj datoteke dok se ne protumači EOL.

Također možete koristiti druge naredbe kao što su head, tail i pipe it to while petlja.

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 pomoću operatora za preusmjeravanje unosa (<).

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

Također možete pohraniti naziv datoteke u varijablu i proslijediti ga kroz operator preusmjeravanja.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

Također možete proslijediti nazive datoteka kao argument svojoj skripti.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

Interni separator polja

Možete raditi s različitim vrstama formata datoteka (CSV, TXT, JSON) i možda ćete htjeti podijeliti sadržaj datoteke na temelju prilagođeni graničnik. U ovom slučaju možete upotrijebiti “Unutarnji razdjelnik polja (IFS)” da biste podijelili sadržaj datoteke i pohranili ga u varijable.

Dopustite mi da vam pokažem kako to radi. Pogledajte datoteku /etc/passwd koja ima dvotočku (:) kao razdjelnik. Sada možete odvojiti svaku riječ iz retka i pohraniti je u zasebnu varijablu.

U donjem primjeru dijelim /etc/passwd datoteku s dvotočkom kao razdjelnikom i pohranjujem svako dijeljenje 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 jedan razdvojeni redak na gornjoj snimci zaslona s obzirom na veličinu snimke zaslona.

Prazni redovi u Linuxu

Prazni redovi se ne zanemaruju kada lutate kroz sadržaj datoteke. Kako bih to pokazao, napravio sam oglednu datoteku sa sadržajem u nastavku. Postoje 4 retka i nekoliko praznih redaka, razmak na početku, razmak na kraju, znakovi tab u retku 2 i neki znakovi za izlaz (\n i \t).

while read LREAD
do
    echo ${LREAD}
done < testfile

Pogledajte rezultat, prazan redak se ne zanemaruje. Također, zanimljivo je primijetiti kako se bijeli prostori skraćuju naredbom read. Jednostavan način za ignoriranje praznih redaka prilikom čitanja sadržaja datoteke je korištenje testnog operatora s oznakom -z koji provjerava je li duljina niza nula. Sada ponovimo isti primjer, ali ovaj put s testnim operatorom.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

Sada iz izlaza možete vidjeti da se prazni redovi zanemaruju.

Likovi za bijeg

Izlazni znakovi kao što su \n, \t, \c neće biti ispisani prilikom čitanja datoteke. Kako bih to pokazao, koristim istu oglednu datoteku koja ima nekoliko izlaznih znakova.

while read LREAD
do
    echo ${LREAD}
done < testfile

Iz izlaza možete vidjeti da su izlazni znakovi izgubili svoje značenje i ispisuju se samo n i t 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 stvorimo bolji sadržaj. Nastavite čitati i podržavajte.