GNU/Linux >> Znalost Linux >  >> Linux

Jak číst soubor řádek po řádku v Bash

Při psaní Bash skriptů se občas dostanete do situací, kdy potřebujete číst soubor řádek po řádku. Můžete mít například textový soubor obsahující data, která by měla být skriptem zpracována.

V tomto tutoriálu probereme, jak číst soubor řádek po řádku v Bash.

Čtení souboru řádek po řádku syntaxe #

Nejobecnější syntaxe pro čtení souboru řádek po řádku je následující:

while IFS= read -r line; do
  printf '%s\n' "$line"
done < input_file

nebo ekvivalentní jednořádková verze:

while IFS= read -r line; do printf '%s\n' "$line"; done < input_file

Jak to funguje?

Vstupní soubor (input_file ) je název souboru přesměrovaného do cyklu while. read příkaz zpracuje soubor řádek po řádku a každý řádek přiřadí k line variabilní. Jakmile jsou všechny řádky zpracovány, smyčka while skončí.

Ve výchozím nastavení read příkaz interpretuje zpětné lomítko jako znak escape a odstraňuje všechny mezery na začátku a na konci, což může někdy způsobit neočekávané chování. Chcete-li zakázat escapování zpětného lomítka, vyvoláme příkaz s -r a chcete-li zakázat oříznutí, interní oddělovač polí (IFS ) je vymazáno.

Používáme [printf ] namísto echo aby byl kód lépe přenosný a aby se zabránilo nežádoucímu chování. Pokud například řádek obsahuje hodnoty jako „-e“, bude to považováno za možnost echo.

Příklady čtení souboru řádek po řádku #

Podívejme se na následující příklad. Předpokládejme, že máme soubor s názvem distros.txt obsahující seznam některých nejoblíbenějších distribucí Linuxu a jejich správců balíčků oddělených čárkou (, ):

distros.txt
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf

Chcete-li číst soubor řádek po řádku, spustili byste ve svém terminálu následující kód:

while IFS= read -r line; do
  printf '%s\n' "$line"
done < distros.txt

Kód čte soubor po řádku, každý řádek přiřadí proměnné a vytiskne ji. V podstatě byste viděli stejný výstup, jako kdybyste zobrazili obsah souboru pomocí cat příkaz.

Co když chcete tisknout pouze distribuce, které používají apt? Jedním ze způsobů by bylo použití if a zkontrolujte, zda řádek obsahuje podřetězec apt:

while IFS= read -r line; do
  if [[ "$line" == *"apt"* ]]; then
    printf '%s\n' "$line"
  fi
done < distros.txt
Ubuntu,apt
Debian,apt

Při čtení souboru řádek po řádku můžete také předat více než jednu proměnnou do read příkaz, který rozdělí řádek na pole na základě IFS . První pole je přiřazeno první proměnné, druhé druhé proměnné atd. Pokud existuje více polí než proměnných, zbývající pole jsou přiřazena poslední proměnné.

V následujícím příkladu nastavíme IFS na čárku (, ) a předejte dvě proměnné distro a pm do read příkaz. Vše od začátku řádku až po první čárku bude přiřazeno první proměnné (distro ) a zbytek řádku bude přiřazen druhé proměnné (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 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

Alternativní metody čtení souborů #

Použití substituce procesu #

Substituce procesu je funkce, která vám umožňuje použít výstup z příkazu jako soubor:

while IFS= read -r line; do
  printf '%s\n' "$line"
done < <(cat input_file )

Použití řetězce Here #

Here String je variantou dokumentu Here. Řetězec (cat input_file ) zachovává nové řádky:

while IFS= read -r line; do
  printf '%s\n' "$line"
done <<< $(cat input_file )

Použití deskriptoru souboru #

Vstup do smyčky můžete také poskytnout pomocí deskriptoru souboru:

while IFS= read -r -u9 line; do
  printf '%s\n' "$line"
done 9< input_file

Při práci s deskriptory souborů používejte číslo mezi 4 a 9, abyste se vyhnuli konfliktu s interními deskriptory souborů shellu.

Závěr č.

V Bash můžeme číst soubor řádek po řádku pomocí cyklu while a read příkaz.

Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.


Linux
  1. Jak v Bash přidám řetězec za každý řádek v souboru?

  2. VIM:jak přejít na přesnou linku na Ubuntu

  3. Jak číst předposlední řádek v souboru pomocí Bash?

  1. Zaneprázdněná schránka Číst soubor řádek po řádku?

  2. Jak číst proměnnou ze souboru?

  3. Jak grepovat část souboru v bash shellu

  1. Jak analyzovat soubor CSV v Bash?

  2. Čtěte řádek po řádku v bash skriptu

  3. Jak zkontrolovat syslog v Bash na Linuxu?