Android

Hoe een bestand regel voor regel in bash te lezen

Pijpen, Grep, Sorteren - Linux Tutorial 9

Pijpen, Grep, Sorteren - Linux Tutorial 9

Inhoudsopgave:

Anonim

Wanneer je Bash-scripts schrijft, kom je soms in situaties terecht waarin je een bestand regel voor regel moet lezen. U hebt bijvoorbeeld een tekstbestand met gegevens dat door het script moet worden verwerkt.

In deze tutorial zullen we bespreken hoe je een bestand regel voor regel in Bash kunt lezen.

Een bestand regel voor regel syntax lezen

De meest algemene syntaxis voor het regel voor regel lezen van een bestand is als volgt:

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

of de equivalente versie met één regel:

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

Hoe werkt het?

Het invoerbestand ( input_file ) is de naam van het bestand dat u wilt openen voor lezen met de opdracht read . De opdracht read leest het bestand regel voor regel en wijst elke regel toe aan de regelvariabele. Zodra alle lijnen zijn verwerkt, wordt de while-lus beëindigd. Het interne veldscheidingsteken ( IFS ) is ingesteld op de null-reeks om voorloop- en volgspaties te behouden, wat het standaardgedrag van de opdracht read .

Een bestand regel voor regel lezen

Laten we het volgende voorbeeld bekijken. Stel dat we een bestand met de naam distros.txt met een lijst van enkele van de populairste Linux-distributies en hun pakketbeheerders gescheiden door komma ( , ):

distros.txt

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

Om het bestand regel voor regel te lezen, voert u de volgende code in uw terminal uit:

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

De code leest het bestand per regel, wijst elke regel toe aan een variabele en echo de variabele. Met Basicity ziet u dezelfde uitvoer alsof u de bestandsinhoud weergeeft met de opdracht cat.

Wat als u alleen de distributies wilt afdrukken die apt gebruiken? Een manier zou zijn om de if-instructie te gebruiken en te controleren of de regel de apt-substring bevat:

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

Ubuntu, apt Debian, apt

Wanneer u het bestand regel voor regel leest, kunt u ook meer dan één variabelen doorgeven aan de opdracht lezen, die de regel in velden splitst op basis van de IFS . Het eerste veld wordt toegewezen aan de eerste variabele, het tweede aan de tweede variabele, enzovoort. Als er meer velden zijn dan variabelen, worden de resterende velden toegewezen aan de laatste variabele.

In het volgende voorbeeld stellen we IFS in op een komma ( , ) en geven we twee variabelen distro en pm aan de opdracht read. Alles vanaf het begin van de regel tot de eerste komma wordt toegewezen aan de eerste variabele ( distro ) en de rest van de regel wordt toegewezen aan de tweede variabele ( 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

Alternatieve methoden voor het lezen van bestanden

Een procesvervanging gebruiken

Met procesvervanging kunt u uitvoer van een opdracht doorgeven als bestandsnaam:

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

Een hier-string gebruiken

Here String is een variant van Here-document. De string (cat input_file) behoudt de nieuwe regels:

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

Bestandsbeschrijving gebruiken

U kunt ook de invoer voor de lus opgeven met behulp van een bestandsdescriptor:

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

Gebruik bij het werken met bestandsdescriptors een nummer tussen 4 en 9 om conflicten met interne bestandsdescriptors van de shell te voorkomen.

Conclusie

In Bash kunnen we een bestand regel voor regel lezen door de bestandsnaam op te geven als invoer voor een tijdige leeslus.

bash-terminal