Eri tapoja lukea tiedostoa Bash-skriptissä Silmukan avulla


Tämä artikkeli käsittelee bash-skriptien tiedostojen lukemista while-silmukan avulla. Tiedoston lukeminen on yleinen ohjelmointitoiminto. Sinun tulee tuntea erilaiset menetelmät ja tuntea, mikä menetelmä on tehokkaampi käyttää. Bashissa yksi tehtävä voidaan saavuttaa monella tapaa, mutta aina on optimaalinen tapa saada tehtävä tehtyä ja meidän tulee noudattaa sitä.

Ennen kuin opit lukemaan tiedoston sisältöä while loop -toiminnolla, lyhyt aluke siitä, miten while-silmukka toimii. While-silmukka arvioi ehdon ja toistaa tietyn koodijoukon, kun ehto on tosi.

while [ CONDITION ]
do
    code block
done

Erotetaan while loop -syntaksi.

  • while loop -avainsanan tulee alkaa while-avainsanalla, jota seuraa ehto.
  • Ehto tulee olla [ ] tai [[ ]] sisällä. Suoritettavan silmukan ehdon tulee aina palauttaa tosi.
  • Varsinainen koodilohko sijoitetaan väliin do ja done.
NUMBER=0

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

Tämä on hyvin yksinkertainen esimerkki, jossa silmukka suoritetaan, kunnes NUMBER on enintään 10 ja tulostaa kaikulausekkeen.

while-komennon lisäksi käytämme read-komentoa tiedoston sisällön lukemiseen rivi riviltä. Alla on syntaksi siitä, kuinka while- ja read-komennot yhdistetään. Nyt on olemassa erilaisia tapoja siirtää tiedosto syötteenä ja näemme ne kaikki.

SYNTAX
while read VARIABLE
do
    code
done

Putket Linuxissa

Normaalisti käytämme cat-komentoa tarkastellaksemme tiedoston sisältöä päätteestä. Liitämme myös cat-komennon tulosteen muihin komentoihin, kuten grep, sort jne.

Vastaavasti käytämme tässä cat-komentoa tiedoston sisällön lukemiseen ja sen ohjaamiseen while-silmukkaan. Esittelyä varten käytän /etc/passwd-tiedostoa, mutta tämän tiedoston kanssa ei ole suositeltavaa sotkea, joten ota tästä tiedostosta varmuuskopio ja pelaa sillä halutessasi.

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

Selvitetään, mitä tapahtuu, kun yllä oleva koodi lähetetään.

  • cat /etc/passwd lukee tiedoston sisällön ja välittää sen syötteenä putken kautta.
  • read-komento lukee jokaisen cat-komennosta syötetyn rivin ja tallentaa sen LREAD-muuttujaan.
  • read-komento lukee tiedoston sisällön, kunnes EOL on tulkittu.

Voit myös käyttää muita komentoja, kuten head, tail ja pipe it to while-silmukkaan.

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

Tulon uudelleenohjaus Linuxissa

Voimme ohjata tiedoston sisällön uudelleen kohtaan while loop käyttämällä Input-uudelleenohjausoperaattoria (<).

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

Voit myös tallentaa tiedostonimen muuttujaan ja välittää sen uudelleenohjausoperaattorin kautta.

FILENAME="/etc/passwd"

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

Voit myös välittää tiedostonimiä komentosarjan argumentteina.

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

Sisäinen kenttäerotin

Voit käyttää erityyppisiä tiedostomuotoja (CSV, TXT, JSON) ja haluat ehkä jakaa tiedoston sisällön mukautettu erotin. Tässä tapauksessa voit jakaa tiedoston sisällön ja tallentaa sen muuttujiin Sisäisen kentän erottimen (IFS) avulla.

Anna minun näyttää, kuinka se toimii. Katso /etc/passwd-tiedosto, jonka erottimena on kaksoispiste (:). Voit nyt jakaa jokaisen sanan riviltä ja tallentaa sen erilliseen muuttujaan.

Alla olevassa esimerkissä jaan /etc/passwd-tiedoston kaksoispisteellä erottimena ja tallennan kunkin jaon eri muuttujiksi.

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

Näytin vain yhden rivin jaetun yllä olevassa kuvakaappauksessa ottaen huomioon kuvakaappauksen koon.

Tyhjät rivit Linuxissa

Tyhjiä rivejä ei huomioida, kun kierrät tiedoston sisällön. Tämän osoittamiseksi olen luonut alla olevan sisällön esimerkkitiedoston. Siinä on 4 riviä ja muutama tyhjä rivi, edessä välilyönti, lopussa välilyönti, rivillä 2 sarkainmerkkejä ja joitain erotusmerkkejä (\n ja \t).

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

Katso tulos, tyhjää riviä ei huomioida. Mielenkiintoinen asia on myös se, kuinka välilyönnit leikataan read-komennolla. Yksinkertainen tapa jättää tyhjät rivit huomioimatta tiedoston sisältöä luettaessa on käyttää testioperaattoria -z-lipulla, joka tarkistaa, onko merkkijonon pituus nolla. Toistetaan nyt sama esimerkki, mutta tällä kertaa testioperaattorilla.

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

Nyt voit nähdä lähdöstä tyhjät rivit ohitetaan.

Pakohahmot

Esc-merkkejä, kuten \n, \t, \c, ei tulosteta tiedostoa luettaessa. Tämän havainnollistamiseksi käytän samaa mallitiedostoa, jossa on vähän erotusmerkkejä.

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

Näet tulosteesta, että estomerkit ovat menettäneet merkityksensä ja vain n ja t tulostetaan \n ja \t sijaan. . Voit estää kenoviivatulkinnan käyttämällä -r-komentoa.

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

Siinä se tälle artikkelille. Otamme mielellämme vastaan, jos sinulla on palautetta tai vinkkejä. Palautteesi auttaa meitä luomaan parempaa sisältöä. Jatka lukemista ja tue.