Android

Slik leser du en fil linje for linje i bash

Shell Scripting Tutorial for Beginners 17 - Read a file content in Bash

Shell Scripting Tutorial for Beginners 17 - Read a file content in Bash

Innholdsfortegnelse:

Anonim

Når du skriver Bash-skript, vil du noen ganger befinne deg i situasjoner der du trenger å lese en fil linje for linje. For eksempel kan du ha en tekstfil som inneholder data som skal behandles av skriptet.

I denne opplæringen skal vi diskutere hvordan du kan lese en fil linje for linje i Bash.

Lese en fil linje for linje syntaks

Den mest generelle syntaks for å lese en fil linje for linje er som følger:

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

eller den tilsvarende versjonen av en linje:

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

Hvordan virker det?

Input-filen ( input_file ) er navnet på filen du vil være åpen for lesing av read kommandoen. read kommandoen leser filen linje for linje og tilordner hver linje til linjevariabelen. Når alle linjer er behandlet, avsluttes loopen. Den interne feltutskilleren ( IFS ) er satt til nullstrengen for å bevare ledende og etterfølgende hvitrom som er standardoppførselen til read kommandoen.

Lese en fil linje for linje-eksempler

La oss se på følgende eksempel. Anta at vi har en fil som heter distros.txt inneholder en liste over noen av de mest populære Linux-distribusjonene og pakkehåndteringene deres atskilt med komma ( , ):

distros.txt

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

For å lese filen linje for linje kjører du følgende kode i terminalen din:

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

Koden vil lese filen etter linje, tilordne hver linje til en variabel og gjenkjenne variabelen. Grunnleggende vil du se den samme utdata som om du ville vise filinnholdet ved å bruke kommandoen katt.

Hva om du bare vil skrive ut distribusjonene som bruker apt? En måte ville være å bruke if-setningen og sjekke om linjen inneholder den passende substring:

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

Ubuntu, apt Debian, apt

Når du leser fil linje for linje, kan du også sende mer enn en variabel til lese-kommandoen som vil dele linjen i felt basert på IFS . Det første feltet er tilordnet den første variabelen, det andre til den andre variabelen, og så videre. Hvis det er flere felt enn variabler, tildeles restfeltene til den siste variabelen.

I det følgende eksemplet setter vi IFS til et komma ( , ) og sender to variabler distro og pm til lese-kommandoen. Alt fra begynnelsen av linjen til det første komma blir tilordnet den første variabelen ( distro ) og resten av linjen vil bli tilordnet den andre variabelen ( 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

Alternative metodelesemetoder

Bruke en prosesserstatning

Prosessubstitusjon lar deg sende utdata fra kommandoen som filnavn:

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

Bruke en her streng

Here String er en variant av Here-dokument. Strengen (cat input_file) vil beholde nylinjene:

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

Ved hjelp av filbeskrivelse

Du kan også gi inndata til loopen ved hjelp av en filbeskrivelse:

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

Når du arbeider med filbeskrivelser, bruk et tall mellom 4 og 9 for å unngå konflikt med interne filbeskrivere.

Konklusjon

I Bash kan vi lese en fil linje for linje ved å gi filnavnet som inngang til en mens mens du leser loopen.

bash terminal