Android

Wie man eine Datei Zeile für Zeile in Bash liest

CSV Dateien richtig interpretieren und erzeugen, Teil 1

CSV Dateien richtig interpretieren und erzeugen, Teil 1

Inhaltsverzeichnis:

Anonim

Beim Schreiben von Bash-Skripten befinden Sie sich manchmal in Situationen, in denen Sie eine Datei zeilenweise lesen müssen. Beispielsweise verfügen Sie möglicherweise über eine Textdatei, die Daten enthält, die vom Skript verarbeitet werden sollen.

In diesem Tutorial erfahren Sie, wie Sie eine Datei zeilenweise in Bash lesen.

Lesen einer Datei Zeile für Zeile Syntax

Die allgemeinste Syntax zum zeilenweisen Lesen einer Datei lautet wie folgt:

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

oder die entsprechende einzeilige Version:

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

Wie funktioniert es?

Die Eingabedatei ( input_file ) ist der Name der Datei, die vom input_file zum Lesen geöffnet werden soll. Der Befehl read liest die Datei zeilenweise und weist jede Zeile der Zeilenvariablen zu. Sobald alle Zeilen abgearbeitet sind, endet die while-Schleife. Das interne Feldtrennzeichen ( IFS ) wird auf die Nullzeichenfolge festgelegt, um das führende und nachfolgende Leerzeichen beizubehalten, das das Standardverhalten des Lesebefehls ist.

Lesen einer Datei Zeile für Zeile Beispiele

Schauen wir uns das folgende Beispiel an. Angenommen, wir haben eine Datei mit dem Namen distros.txt die eine Liste der beliebtesten Linux-Distributionen und ihrer Paketmanager enthält, die durch Komma ( , ) getrennt sind:

distros.txt

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

Um die Datei zeilenweise zu lesen, führen Sie den folgenden Code in Ihrem Terminal aus:

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

Der Code liest die Datei zeilenweise, weist jede Zeile einer Variablen zu und gibt die Variable zurück. Grundsätzlich sehen Sie die gleiche Ausgabe, als würden Sie den Dateiinhalt mit dem Befehl cat anzeigen.

Was ist, wenn Sie nur die Distributionen drucken möchten, die apt verwenden? Eine Möglichkeit wäre, die if-Anweisung zu verwenden und zu überprüfen, ob die Zeile den apt-Teilstring enthält:

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

Ubuntu, apt Debian, apt

Wenn Sie eine Datei zeilenweise lesen, können Sie auch mehr als eine Variable an den Befehl read übergeben, wodurch die Zeile auf der Grundlage des IFS in Felder aufgeteilt wird. Das erste Feld wird der ersten Variablen, das zweite der zweiten Variablen usw. zugewiesen. Wenn mehr Felder als Variablen vorhanden sind, werden die verbleibenden Felder der letzten Variablen zugewiesen.

Im folgenden Beispiel setzen wir IFS auf ein Komma ( , ) und übergeben zwei Variablen distro und pm an den Befehl read. Alles vom Zeilenanfang bis zum ersten Komma wird der ersten Variablen ( distro ) und der Rest der Zeile der zweiten Variablen ( pm ) zugewiesen:

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 Methoden zum Lesen von Dateien

Prozessersetzung verwenden

Mit der Prozessersetzung können Sie die Ausgabe des Befehls als Dateinamen übergeben:

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

Verwenden eines Here-Strings

Here String ist eine Variante von Here document. Die Zeichenfolge (cat input_file) behält die Zeilenumbrüche bei:

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

Dateideskriptor verwenden

Sie können die Eingabe für die Schleife auch mithilfe eines Dateideskriptors bereitstellen:

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

Verwenden Sie beim Arbeiten mit Dateideskriptoren eine Zahl zwischen 4 und 9, um Konflikte mit den internen Dateideskriptoren der Shell zu vermeiden.

Fazit

In Bash können wir eine Datei zeilenweise lesen, indem wir den Dateinamen als Eingabe für eine while-Leseschleife bereitstellen.

Bash-Terminal