Android

Kako čitati datoteku po liniju u bashu

Fun with Music and Programming by Connor Harris and Stephen Krewson

Fun with Music and Programming by Connor Harris and Stephen Krewson

Sadržaj:

Anonim

Kad pišete Bashove skripte, ponekad ćete se naći u situacijama u kojima morate pročitati datoteku po red. Na primjer, možda imate tekstualnu datoteku koja sadrži podatke koje treba obraditi skripta.

U ovom ćemo udžbeniku razgovarati o načinu čitanja datoteke po retku u Bashu.

Čitanje datoteka po liniji sintaksa

Najopćenitija sintaksa za čitanje datoteke redak po red je sljedeća:

while IFS= read -r line do echo "$line" done < input_file

ili ekvivalentna inačica jednog retka:

while IFS= read -r line; do echo $line; done < input_file

Kako radi?

Ulazna datoteka ( input_file ) je naziv datoteke koju želite otvoriti za čitanje pomoću naredbe za read . Naredba za read čita datoteku liniju po red, dodjeljujući svaki redak line varijabli. Nakon obrade svih linija, petlja će prestati. Interni razdjelnik polja ( IFS ) postavljen je na null niz kako bi se sačuvao vodeći i kasni razmak bjeline što je zadano ponašanje naredbe za read .

Čitanje primjera datoteke po redovima

Pogledajmo sljedeći primjer. Pretpostavimo da imamo datoteku pod nazivom distros.txt koja sadrži popis nekih od najpopularnijih distribucija Linuxa i njihovih upravitelja paketa odvojenih zarezom ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

Da biste pročitali datoteku liniju po red, pokrenuli biste u svom terminalu sljedeći kôd:

while IFS= read -r line do echo "$line" done < distros.txt

Kôd će čitati datoteku po red, dodijeliti svaku liniju varijabli i odjeknuti varijablom. Osnovnost vidjela bi isti izlaz kao da prikazujete sadržaj datoteke pomoću cat naredbe.

Što ako želite ispisati samo distribucije koje upotrebljavaju apt? Jedan od načina bila bi upotreba stavka if i provjera sadrži li linija odgovarajuću podstvor:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Kad čitate datoteku liniju po red, također možete proslijediti više od jedne varijable naredbi za čitanje koja će liniju podijeliti u polja na temelju IFS . Prvo polje dodijeljeno je prvoj varijabli, drugo drugom varijablu i tako dalje. Ako postoji više polja od varijabli, preostala polja dodijeljena su posljednjoj varijabli.

U sljedećem primjeru postavljamo IFS na zarez ( , ) i prosljeđujemo dvije varijable distro i pm naredbi read. Sve od početka retka do prvog zareza će biti dodijeljeno prvoj varijabli ( distro ), a ostatak redaka bit će dodijeljen drugoj varijabli ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

Alternativne metode čitanja datoteka

Korištenje procesne zamjene

Zamjena procesa omogućava vam da iz naziva naredbe proslijedite kao naziv datoteke:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Upotrebom niza ovdje

Here String je varijanta dokumenta Here. Niz (cat input_file) zadržat će nove (cat input_file) :

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

Upotreba deskriptora datoteke

Ulaz u petlju također možete dati pomoću deskriptora datoteke:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

Kad radite s deskriptorima datoteka, koristite broj između 4 i 9 da biste izbjegli sukob s opisnicima internih datoteka ljuske.

Zaključak

U Bashu možemo čitati datoteku pojedinačno po redoslijedu tako što ćemo naziv datoteke unijeti u petlju za čitanje.

bash terminal