Android

Jak czytać plik linia po linii w bash

Skrypty powłoki Bash

Skrypty powłoki Bash

Spisu treści:

Anonim

Pisząc skrypty Bash, czasami znajdziesz się w sytuacjach, w których musisz czytać plik linia po linii. Na przykład możesz mieć plik tekstowy zawierający dane, które powinny zostać przetworzone przez skrypt.

W tym samouczku omówimy, jak czytać plik linia po linii w Bash.

Czytanie pliku Składnia linia po linii

Najbardziej ogólna składnia odczytu pliku wiersz po wierszu jest następująca:

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

lub równoważna wersja jednowierszowa:

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

Jak to działa?

Plik wejściowy ( input_file ) to nazwa pliku, który chcesz otworzyć do odczytu poleceniem read . Polecenie read odczytuje plik linia po linii, przypisując każdą linię do zmiennej line . Po przetworzeniu wszystkich linii pętla while zakończy się. Wewnętrzny separator pól ( IFS ) jest ustawiony na łańcuch zerowy, aby zachować początkowe i końcowe białe znaki, które są domyślnym zachowaniem polecenia read .

Czytanie pliku linia po linii Przykłady

Rzućmy okiem na następujący przykład. Załóżmy, że mamy plik o nazwie distros.txt zawierający listę najpopularniejszych dystrybucji Linuksa i ich menedżerów pakietów oddzielonych przecinkami ( , ):

distros.txt

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

Aby odczytać plik linia po linii, uruchom w swoim terminalu następujący kod:

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

Kod odczyta plik po linii, przypisze każdą linię do zmiennej i wyśle ​​echo zmiennej. Zasadniczo zobaczyłbyś to samo wyjście, jakbyś wyświetlał zawartość pliku za pomocą polecenia cat.

Co jeśli chcesz wydrukować tylko dystrybucje korzystające z apt? Jednym ze sposobów byłoby użycie instrukcji if i sprawdzenie, czy wiersz zawiera apt substring:

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

Ubuntu, apt Debian, apt

Podczas odczytywania pliku linia po linii można również przekazać więcej niż jedną zmienną do polecenia read, która podzieli linię na pola na podstawie IFS . Pierwsze pole jest przypisane do pierwszej zmiennej, drugie do drugiej zmiennej i tak dalej. Jeśli jest więcej pól niż zmiennych, pozostałe pola są przypisywane do ostatniej zmiennej.

W poniższym przykładzie ustawiamy IFS na przecinek ( , ) i przekazujemy dwie zmienne distro i pm do polecenia read. Wszystko od początku linii do pierwszego przecinka zostanie przypisane do pierwszej zmiennej ( distro ), a reszta linii zostanie przypisana do drugiej zmiennej ( 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

Alternatywne metody odczytu plików

Korzystanie z podstawienia procesu

Podstawienie procesu pozwala przekazać dane wyjściowe z polecenia jako nazwę pliku:

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

Korzystanie z ciągu tutaj

Here String to wariant dokumentu Here. Ciąg (cat input_file) zachowa nowe linie:

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

Korzystanie z deskryptora pliku

Można również podać dane wejściowe do pętli za pomocą deskryptora pliku:

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

Podczas pracy z deskryptorami plików używaj liczb od 4 do 9, aby uniknąć konfliktu z wewnętrznymi deskryptorami plików powłoki.

Wniosek

W Bash możemy odczytać plik wiersz po wierszu, podając nazwę pliku jako dane wejściowe do pętli while read.

terminal bash