Android

Sådan læses en fil linje for linje i bash

Playful Kiss - Playful Kiss: Full Episode 1 (Official & HD with subtitles)

Playful Kiss - Playful Kiss: Full Episode 1 (Official & HD with subtitles)

Indholdsfortegnelse:

Anonim

Når du skriver Bash-scripts, vil du nogle gange befinde dig i situationer, hvor du har brug for at læse en fil linje for linje. For eksempel kan du have en tekstfil, der indeholder data, der skal behandles af scriptet.

I denne tutorial vil vi diskutere, hvordan man læser en fil linje for linje i Bash.

Læsning af en fil linje for linje syntaks

Den mest generelle syntaks til læsning af en fil linje for linje er som følger:

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

eller den tilsvarende enkeltlinjeversion:

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

Hvordan virker det?

Input-filen ( input_file ) er navnet på den fil, du vil være åben for at læse af read kommandoen. read kommandoen læser filen linje for linje og tildeler hver linje til linjevariablen. Når alle linier er behandlet, afsluttes mens loopen afsluttes. Den interne feltudskiller ( IFS ) er indstillet til nullstrengen for at bevare førende og bageste hvidafstand, som er standardopførsel for read kommandoen.

Læsning af en fil linje for linje-eksempler

Lad os se på følgende eksempel. Antag, vi har en fil med navnet distros.txt indeholder en liste over nogle af de mest populære Linux-distributioner og deres pakkeadministratorer adskilt med komma ( , ):

distros.txt

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

For at læse filen linje for linje kører du følgende kode i din terminal:

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

Koden læser filen efter linje, tildeler hver linje til en variabel og gentager variablen. Basicitet ville du se den samme output, som hvis du ville vise filindholdet ved hjælp af kommandoen kat.

Hvad hvis du kun vil udskrive de distributioner, der bruger apt? En måde ville være at bruge if-sætningen og kontrollere, om linjen indeholder den passende substring:

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

Ubuntu, apt Debian, apt

Når du læser fil linje for linje, kan du også videregive mere end én variabler til læse-kommandoen, som vil opdele linjen i felter baseret på IFS . Det første felt tildeles til den første variabel, det andet til den anden variabel osv. Hvis der er flere felter end variabler, tildeles resterende felter til den sidste variabel.

I det følgende eksempel indstiller vi IFS til et komma ( , ) og overfører to variabler distro og pm til læse-kommandoen. Alt fra starten af ​​linjen, indtil det første komma tildeles den første variabel ( distro ), og resten af ​​linjen tildeles den anden variabel ( 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 metodelæsningsmetoder

Brug af en processubstitution

Processsubstitution giver dig mulighed for at videresende output fra kommandoen som filnavn:

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

Brug af en her streng

Here String er en variant af Here-dokument. Strengen (cat input_file) holder de nye linjer:

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

Brug af filbeskrivelse

Du kan også give input til loopen ved hjælp af en filbeskrivelse:

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

Når du arbejder med filbeskrivelser, skal du bruge et tal mellem 4 og 9 for at undgå konflikt med interne interne filbeskrivelser.

Konklusion

I Bash kan vi læse en fil linje for linje ved at give filnavnet som et input til en læsningsløkken til et stykke tid.

bash terminal