Android

Hur man läser en fil rad för rad i bash

sed: Easily replace strings across files | #7 Practical Bash

sed: Easily replace strings across files | #7 Practical Bash

Innehållsförteckning:

Anonim

När du skriver Bash-skript kommer du ibland att befinna dig i situationer där du behöver läsa en fil rad för rad. Till exempel kan du ha en textfil som innehåller data som ska behandlas av skriptet.

I denna handledning kommer vi att diskutera hur du läser en fil rad för rad i Bash.

Läsa en fil rad för rad syntax

Den vanligaste syntaxen för att läsa en fil rad för rad är som följer:

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

eller motsvarande enkelradiga version:

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

Hur fungerar det?

Inmatningsfilen ( input_file ) är namnet på filen du vill vara öppen för läsning med läsningskommandot. read kommandot läser fil rad för rad och tilldelar varje rad till radvariabeln. När alla rader har bearbetats avslutas medan-loopen. Den interna fältavskiljaren ( IFS ) är inställd på nollsträngen för att bevara ledande och efterföljande vitrum som är standardbeteendet för läskommandot.

Läsa en fil rad för rad exempel

Låt oss ta en titt på följande exempel. Anta att vi har en fil med namnet distros.txt innehåller en lista över några av de mest populära Linux-distributionerna och deras pakethanter separerade med komma ( , ):

distros.txt

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

För att läsa filen rad för rad kör du följande kod i din terminal:

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

Koden läser filen för rad, tilldelar varje rad till en variabel och eko variabeln. I grunden skulle du se samma utgång som om du skulle visa filinnehållet med kattkommandot.

Tänk om du bara vill skriva ut de distributioner som använder apt? Ett sätt skulle vara att använda if-satsen och kontrollera om raden innehåller apt 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 rad för rad kan du också skicka mer än en variabel till läsekommandot som delar upp raden i fält baserade på IFS . Det första fältet tilldelas den första variabeln, det andra till den andra variabeln och så vidare. Om det finns fler fält än variabler tilldelas resterande fält till den sista variabeln.

I följande exempel ställer vi IFS till ett komma ( , ) och distro två variabler distro och pm till läs-kommandot. Allt från början av raden tills den första komma kommer att tilldelas den första variabeln ( distro ) och resten av linjen tilldelas den andra variabeln ( 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

Alternativa filläsningsmetoder

Använda en processsubstitution

Processersättning gör att du kan skicka utdata från kommandot som filnamn:

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

Använda en här sträng

Here String är en variant av Here-dokument. Strängen (cat input_file) behåller de nya linjerna:

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

Med hjälp av filbeskrivning

Du kan också ge inmatningen till loopen med en filbeskrivning:

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

När du arbetar med filbeskrivningar använder du ett nummer mellan 4 och 9 för att undvika konflikt med interna filbeskrivare.

Slutsats

I Bash kan vi läsa en fil rad för rad genom att tillhandahålla filnamnet som en inmatning till en stundlässlinga.

bash terminal