când scrieți scripturi Bash, vă veți găsi uneori în situații în care trebuie să citiți o linie de fișier cu linie. De exemplu, este posibil să aveți un fișier text care conține date care ar trebui procesate de script.
în acest tutorial, vom discuta cum să citiți o linie de fișier cu linie în Bash.,
Citirea unui Fișier linie Cu Linie Sintaxa #
Cele mai generale de sintaxă pentru a citi un fișier linie cu linie este după cum urmează:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
sau echivalentul singură linie versiune:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Cum funcționează?
fișierul de intrare (input_file
) este numele fișierului redirecționat către bucla while. Comanda read
procesează linia de fișier cu linie, atribuind fiecare linie variabileiline
. Odată ce toate liniile sunt procesate, bucla while se termină.,
în mod implicit, comandaread
interpretează backslash-ul ca un caracter de evadare și elimină toate spațiile albe de conducere și de sfârșit, care uneori pot provoca un comportament neașteptat. Pentru a dezactiva backslash scapă, suntem invocarea comanda cu -r
opțiune, și pentru a dezactiva tunderea, interne separator de câmp (IFS
) este eliminat.
folosim în loc de echo
pentru a face Codul mai portabil și pentru a evita comportamentele nedorite., De exemplu, dacă linia conține valori precum „-e”, aceasta va fi tratată ca o opțiune ecou.
citirea unei linii de fișier cu exemple de linie #
Să aruncăm o privire la următorul exemplu. Să presupunem că avem un fișier numit distros.txt
conține o listă a unora dintre cele mai populare distributii de Linux, și managerii de pachete separate cu virgulă (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
Pentru a citi fișier linie cu linie, va rula codul de mai jos în terminal:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
codul citește fișierul de linie, atribuie fiecare linie de la o variabilă, și imprimă. Practic, veți vedea aceeași ieșire ca și cum ați afișa conținutul fișierului folosind comanda cat
.ce se întâmplă dacă doriți să imprimați numai distribuțiile care utilizează apt?, O modalitate ar fi de a utiliza if
declarație și verificați dacă linia conține apt subșir :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
Când citiți un fișier linie cu linie, puteți trece, de asemenea, mai mult de o singură variabilă la read
comanda, care va împărți linia în domenii bazate pe IFS
. Primul câmp este atribuit primei variabile, a doua la a doua variabilă și așa mai departe. Dacă există mai multe câmpuri decât variabile, câmpurile rămase sunt atribuite ultimei variabile.,
În exemplul următor, ne-am stabilit IFS
pentru o virgulă (,
) și să treacă două variabile distro
și pm
la read
comandă.,tot de la începutul liniei pana la prima virgula va fi atribuit pentru prima variabilă (distro
), iar restul de linie va fi atribuit la cea de-a doua variabilă (pm
):
while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora
Alternative de Fișier Metode de Lectură #
Folosind un Proces de Substituire #
Proces de substituire este o caracteristică care vă permite să utilizați ieșire de comandă ca un fișier:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
Folosind o Aici Șir #
Aici Șir este o variantă de Aici documentul ., Șirul (cat input_file )
păstrează liniile:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
Utilizarea descriptorului #
puteți oferi, de asemenea, de intrare la bucla folosind un descriptor de fisier:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
atunci Când se lucrează cu descriptorii de fișier , utilizați un număr între 4 și 9 pentru a evita un conflict cu coajă interne descriptorii de fișier.
concluzie #
în Bash, putem citi un fișier linie cu linie folosind o buclă while și comanda read
.
Lasă un răspuns