Android

Cum să citiți un fișier linie rând în bash

? Cum sa faci un Script in Linux folosind Bash | Invata Linux Ep. 34

? Cum sa faci un Script in Linux folosind Bash | Invata Linux Ep. 34

Cuprins:

Anonim

Când scrieți scripturi Bash, vă veți găsi uneori în situații în care trebuie să citiți un fișier rând cu rând. De exemplu, este posibil să aveți un fișier text care conține date care ar trebui să fie procesate de script.

În acest tutorial, vom discuta despre cum puteți citi un fișier linie cu linie în Bash.

Citirea unei sintaxe linie după linie

Cea mai generală sintaxă pentru citirea unui fișier linie cu linie este următoarea:

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

sau versiunea echivalentă cu o singură linie:

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

Cum functioneazã?

Fișierul de intrare ( input_file ) este numele fișierului pe care doriți să fie deschis pentru citire prin comanda read . Comanda de read citește fișierul rând cu linie, alocând fiecare line variabilei line . Odată ce toate liniile sunt procesate, bucla de timp se va încheia. Separatorul de câmp intern ( IFS ) este setat pe șirul nul pentru a păstra spațiul alb și principal, care este comportamentul implicit al comenzii read .

Citirea unei fișiere Exemple de linie

Să aruncăm o privire la următorul exemplu. Să presupunem, avem un fișier numit distros.txt care conține o listă cu unele dintre cele mai populare distribuții Linux și managerii lor de pachete separate cu virgulă ( , ):

distros.txt

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

Pentru a citi fișierul rând cu rând, ar trebui să rulați următorul cod pe terminalul dvs.:

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

Codul va citi fișierul după linie, va atribui fiecare linie unei variabile și va ecua variabila. De bază, veți vedea aceeași ieșire ca și cum ar afișa conținutul fișierului folosind comanda cat.

Ce se întâmplă dacă doriți să imprimați numai distribuțiile care folosesc apt? O modalitate ar fi să folosiți instrucțiunea if și să verificați dacă linia conține substrat apt:

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

Ubuntu, apt Debian, apt

Când citiți fișier linie cu linie, puteți trece, de asemenea, mai multe variabile la comanda de citire, care va împărți linia în câmpuri bazate pe IFS . Primul câmp este atribuit primei variabile, al doilea 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, setăm IFS la o virgulă ( , ) și trecem două variabile distro și pm la comanda citită. Totul de la începutul liniei până la prima virgulă va fi alocat primei variabile ( distro ), iar restul liniei va fi alocat celei de-a doua variabile ( 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

Metode alternative de citire a fișierelor

Utilizarea unei substituții de proces

Înlocuirea procesului vă permite să treceți ieșirea din comandă ca nume de fișier:

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

Folosind o șiruri aici

Aici șirul este o variantă a documentului Here. Șirul (cat input_file) va păstra liniile noi:

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

Folosind descriptor de fișiere

Puteți furniza, de asemenea, intrarea în buclă folosind un descriptor de fișier:

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

Când lucrați cu descriptori de fișiere, utilizați un număr între 4 și 9 pentru a evita conflictul cu descriptorii de fișiere interne shell.

Concluzie

În Bash, putem citi un fișier linie cu linie, furnizând numele de fișier ca o intrare la o buclă de citire în timp.

terminalul bash