wanneer u Bash scripts schrijft, komt u soms in situaties terecht waarin u een bestand regel voor regel moet lezen. U kunt bijvoorbeeld een tekstbestand hebben met gegevens die door het script moeten worden verwerkt.
in deze tutorial zullen we bespreken hoe je een bestand regel voor regel kunt lezen in Bash.,
het lezen van een bestand regel voor regel syntaxis #
de meest algemene syntaxis voor het lezen van een bestand regel voor regel is als volgt:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
of de equivalente single-line versie:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
How werkt het?
het invoerbestand (input_file
) is de naam van het bestand dat wordt omgeleid naar de while-lus. Het commando read
verwerkt het bestand regel voor regel, waarbij elke regel wordt toegewezen aan de variabele line
. Zodra alle regels zijn verwerkt, eindigt de while-lus.,
standaard interpreteert het commando read
de backslash als een escape-teken en verwijdert alle voor-en achterliggende spaties, wat soms onverwacht gedrag kan veroorzaken. Om backslash-escaping uit te schakelen, roepen we het commando aan met de -r
optie, en om het trimmen uit te schakelen, is het interne veldscheidingsteken (IFS
) gewist.
We gebruiken in plaats van echo
om de code draagbaarder te maken en ongewenst gedrag te voorkomen., Als de regel bijvoorbeeld waarden zoals “-e” bevat, wordt deze behandeld als een echo-optie.
het lezen van een bestand regel voor regel voorbeelden #
laten we eens kijken naar het volgende voorbeeld. Stel dat we een bestand hebben met de naam distros.txt
dat een lijst bevat van enkele van de meest populaire Linux distributies, en hun pakketbeheerders gescheiden met een komma (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
om het bestand regel voor regel te lezen, voert u de volgende code uit in uw terminal:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
de code leest het bestand op regel, wijst elke regel toe aan een variabele en drukt het af. In principe zou je dezelfde uitvoer zien alsof je de inhoud van het bestand zou weergeven met behulp van het cat
Commando.
Wat als u alleen de distributies wilt afdrukken die apt gebruiken?, Een manier zou zijn om de if
statement te gebruiken en te controleren of de regel de apt substring bevat :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
bij het lezen van een bestand regel voor regel, kunt u ook meer dan één variabele doorgeven aan de read
commando, dat de regel zal splitsen in velden gebaseerd op IFS
. Het eerste veld wordt toegewezen aan de eerste variabele, het tweede aan de tweede variabele, enzovoort. Als er meer velden dan variabelen zijn, worden de overgebleven velden toegewezen aan de laatste variabele.,
in het volgende voorbeeld zetten we IFS
in een komma (,
) en geven twee variabelen distro
en pm
aan de read
commando.,erything vanaf het begin van de lijn tot de eerste komma zal worden toegewezen aan de eerste variabele (distro
), en de rest van de regel zal worden toegewezen aan de tweede variabele (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
Alternatieve Bestand Lezen Methoden #
met Behulp van een Proces Substitutie #
Proces substitutie is een functie waarmee u de uitvoer van het commando op als een bestand:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
met Behulp van een Hier String #
Hier String is een variant van het Hier-document ., De tekenreeks (cat input_file )
behoudt de nieuwe regels:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
met behulp van bestandsdescriptor #
u kunt ook de invoer naar de lus opgeven met behulp van een bestandsdescriptor:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
<
gebruik bij het werken met bestandsdescriptoren een getal tussen 4 en 9 om conflicten met interne bestandsdescriptoren van Shell te voorkomen.
conclusie #
In Bash kunnen we een bestand regel voor regel lezen met behulp van een While loop en het read
Commando.
Geef een reactie