Različni načini branja datotek v skriptu Bash s pomočjo While Loop


Ta članek govori o branju datotek v skriptih bash z uporabo zanke while. Branje datoteke je pogosta operacija pri programiranju. Morali bi biti seznanjeni z različnimi metodami in katero metodo je bolj učinkovito uporabljati. V bashu je eno nalogo mogoče doseči na več načinov, vendar vedno obstaja optimalen način za izvedbo naloge, ki bi ji morali slediti.

Preden si ogledate, kako beremo vsebino datotek z uporabo zanke while, kratek priročnik o tem, kako deluje zanka. Zanka while oceni stanje in se ponovi v določenem nizu kod, ko je pogoj resničen.

while [ CONDITION ]
do
    code block
done

Razčlenimo sintakso loop.

  • zanka while naj se začne s ključno besedo while, ki ji sledi pogoj.
  • Pogoj mora biti zaprt v [] ali [[]]. Pogoj mora vedno vrniti true za izvedbo zanke.
  • Dejanski blok kode bo postavljen med do in do konca.

NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

To je zelo preprost primer, kjer se zanka izvaja, dokler NUMBER ni večja od 10 in natisne stavek echo.

Skupaj z ukazom read bomo uporabili za branje vsebine datoteke po vrsticah. Spodaj je sintaksa kombiniranja ukazov while in read. Zdaj obstajajo različni načini, kako datoteko posredovati kot vhod in videli bomo vse.

# SYNTAX
while read VARIABLE
do
    code
done

Cevovodi v Linuxu

Običajno bomo uporabili sorto itd.

Podobno bomo tukaj uporabili ukaz cat za branje vsebine datoteke in njeno usmerjanje v zanko while. Za predstavitev uporabljam datoteko/etc/passwd, vendar ni priporočljivo, da se z njo motate, zato vzemite varnostno kopijo te datoteke in se z njo igrajte, če želite.

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

Razčlenimo, kaj se bo zgodilo, ko bo predložena zgornja koda.

  • cat/etc/passwd bo prebral vsebino datoteke in jo poslal kot vhod skozi cev.
  • ukaz read prebere vsako vrstico, ki je bila posredovana kot vhod iz ukaza cat, in jo shrani v spremenljivko LREAD.
  • ukaz read bo bral vsebino datoteke, dokler se EOL ne razlaga.

Uporabite lahko tudi druge ukaze, kot so glava, rep in napeljete v zanko while.

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

Preusmeritev vnosa v Linuxu

Vsebino datoteke lahko preusmerimo v zanko while z uporabo operaterja preusmeritve vnosa (<) .

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

Ime datoteke lahko shranite tudi v spremenljivko in jo posredujete prek operaterja preusmeritve.

FILENAME="/etc/passwd"

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

Imena datotek lahko kot argument prenesete tudi v svoj skript.

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

Notranji ločevalnik polja

Morda delate z različnimi vrstami formatov datotek (CSV, TXT, JSON) in boste morda želeli vsebino datoteke razdeliti na podlagi ločila po meri. V tem primeru lahko z\"Notranjim ločevalnikom polj (IFS)" razdelite vsebino datoteke in jo shranite v spremenljivke.

Naj predstavim, kako deluje. Oglejte si datoteko/etc/passwd, ki ima ločilo dvopičje (:) . Zdaj lahko vsako besedo razdelite iz vrstice in jo shranite v ločeno spremenljivko.

V spodnjem primeru razdelim datoteko/etc/passwd z dvopičjem kot ločilom in shranim vsak razcep v različne spremenljivke.

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

Na zgornjem posnetku zaslona sem prikazal le eno vrstico glede na velikost posnetka zaslona.

Prazne vrstice v Linuxu

Prazne vrstice se ne prezrejo, ko se peljete skozi vsebino datoteke. Za dokazovanje tega sem ustvaril vzorčno datoteko s spodnjo vsebino. Obstajajo 4 vrstice in nekaj praznih vrstic, presledki pred začetkom, zaostali presledki, znaki zavihkov v vrstici 2 in nekaj ubežnih znakov (\ n in\t)

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

Glejte rezultat, prazna vrstica ni prezrta. Zanimivo je tudi to, kako so ukazi za branje obrezani s presledki. Preprost način zanemarjanja praznih vrstic pri branju vsebine datoteke je uporaba testnega operaterja z zastavico -z , ki preveri, ali je dolžina niza enaka nič. Zdaj ponovimo isti primer, vendar tokrat s testnim operaterjem.

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

Zdaj iz izhoda lahko vidite, da so prazne vrstice prezrte.

Znaki pobega

Ubežni znaki, kot so \n , \t , \c , med branjem datoteke ne bodo natisnjeni. Za dokazovanje tega uporabljam isto vzorčno datoteko, ki ima malo ubežnih znakov.

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

Iz izhodnega izhoda lahko vidite, da so znaki izgubili pomen in se natisneta le n in t namesto \n in \t . Za preprečevanje interpretacije poševnice lahko uporabite -r .

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

To je to za ta članek. Radi bi se oglasili, če boste dobili kakšne povratne informacije ali nasvete. Vaše povratne informacije nam pomagajo ustvariti boljše vsebine. Nadaljujte z branjem in še naprej podpirajte.