GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So lesen Sie Dateien Zeile für Zeile in Bash

Einführung

Wenn Sie eine Datei Zeile für Zeile lesen, können Sie den Inhalt einer Datei effektiv verarbeiten und jede Zeile als Element in einer Liste ausgeben. Nachdem jede Zeile separat angezeigt wurde, können Sie ganz einfach nach bestimmten Inhalten suchen oder diese abgleichen.

Eine der Möglichkeiten, eine Textdatei in einzelnen Zeilen zu lesen, ist die Verwendung der Bash-Shell.

In diesem Tutorial lernen Sie, eine Datei Zeile für Zeile in Bash zu lesen.

Voraussetzungen

  • Ein System, auf dem Linux ausgeführt wird.
  • Zugriff auf ein Terminal (Strg + Alt + T ).
  • Ein Texteditor (wie Nano oder vi/vim).

Zeileweises Lesen in Bash

Es gibt mehrere Methoden, um eine Datei Zeile für Zeile mit Bash zu lesen. Die folgenden Abschnitte stellen fünf Methoden vor, um eine Datei zeilenweise mit Bash zu verarbeiten.

Methode 1:Lesebefehl und While-Schleife verwenden

Die erste Methode besteht darin, den Lesebefehl und ein while zu verwenden Schleife in einem Bash-Skript. Während es in einem Terminal möglich ist, dasselbe zu tun, speichern Bash-Skripte den Code und machen ihn wiederverwendbar. Führen Sie die folgenden Schritte aus:

1. Öffnen Sie das Terminal (Strg + Alt + T ) und erstellen Sie ein neues Bash-Skript mit einem Texteditor wie vi/vim:

vi line.sh

2. Geben Sie die folgenden Zeilen ein:

#!/bin/bash
file="days.txt"
while read -r line; do
echo -e "$line\n"
done <$file
  • Die $file Die Variable wird nach der Shebang-Zeile (der ersten Zeile in Bash-Skripten) definiert und speichert den Pfad zu der Eingabedatei, die Sie verarbeiten möchten.
  • Das -r Argument, das an read angehängt wird verhindert die Interpretation von Backslash-escaped Zeichen, während der Inhalt der Datei gelesen wird.
  • Der Inhalt jeder Zeile wird in $line gespeichert Variable. Innerhalb von while loop, gibt der echo-Befehl die $line aus Inhalt der Variable. Das -e Argument erlaubt echo um Sonderzeichen wie das Zeilenumbruchzeichen \n zu interpretieren .
  • Das while Die Schleife wird fortgesetzt, bis sie das Ende der Datei erreicht und die Schleife endet.

3. Speichern Sie das Skript und beenden Sie vi:

:wq

4. Führen Sie das Skript aus:

bash line.sh

Das Skript gibt jede Zeile der Beispieltextdatei separat aus.

Methode 2:Cat-Befehl und for-Schleife verwenden

Eine andere Methode, um den Inhalt einer Datei in einzelnen Zeilen anzuzeigen, ist die Verwendung des cat-Befehls und des for Schleife. Der for Schleife erlaubt echo um die Zeilen von cat zu drucken Befehlsausgabe bis zum Ende der Datei.

Führen Sie die folgenden Schritte aus:

1. Erstellen Sie ein neues Skript:

vi readfile.sh

2. Geben Sie die folgenden Zeilen ein:

#!/bin/bash
file=$(cat days.txt)
for line in $file
do
echo -e "$line\n"
done
  • Die $file Die Variable speichert den Inhalt der Eingabedatei mithilfe von cat Befehl.
  • Der for Schleife durchläuft jede Zeile von cat Befehlsausgabe und druckt sie mit echo Befehl bis zum Ende der Datei.

3. Speichern Sie das Skript und beenden Sie vi:

:wq

4. Führen Sie das Skript aus:

bash readfile.sh

Das Skript gibt den Inhalt der Datei zeilenweise in der Standardausgabe aus.

Methode 3:Hier Strings verwenden

Eine andere Methode, den Inhalt einer Datei zeilenweise auszugeben, ist die Verwendung eines here Zeichenfolge, um den Inhalt der Datei an read weiterzuleiten Befehl. Das here string verbindet den Inhalt einer Variablen, eines Strings oder einer Datei, die nach dem <<< angegeben ist Syntax an die Standardeingabe des aufgerufenen Programms.

Führen Sie die folgenden Schritte aus:

1. Erstellen Sie ein neues Bash-Skript:

vi herestrings.sh

2. Geben Sie die folgenden Zeilen ein:

#!/bin/bash
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat days.txt )
  • Im while Schleife, die IFS= Argument ist ein leerer String, um das Trimmen von Leerzeichen zu verhindern.
  • Das -r -Argument verhindert die Interpretation von Backslash-escaped Zeichen.
  • Der printf Befehl druckt jede Zeile der Datei. Die Formatbezeichner behandeln die Eingabe als Zeichenfolge (%s ) und fügen Sie ein Zeilenumbruchzeichen hinzu (\n ) nach jeder Zeile.
  • Das here String füttert die cat Befehlsausgabe an read Befehl.

3. Speichern Sie das Skript und beenden Sie den Editor:

:wq

4. Führen Sie das Skript aus:

bash herestrings.sh

Die Ausgabe gibt den Inhalt der Datei Zeile für Zeile aus.

Methode 4:Verwenden von Dateideskriptoren

Ein Dateideskriptor bezieht sich auf eine geöffnete Datei oder einen geöffneten Prozess. Jeder Prozess hat drei Standard-Dateideskriptoren:

  • 0 . Standardeingabe.
  • 1 . Standardausgabe.
  • 2 . Standardfehler.

Stellen Sie die Eingabe für read bereit Befehl mit einem Dateideskriptor und geben Sie jede Zeile aus dem Inhalt der Datei separat aus. Führen Sie die folgenden Schritte aus:

1. Erstellen Sie ein neues Bash-Skript:

vi descriptors.sh

2. Geben Sie die folgenden Zeilen ein:

#!/bin/bash
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< days.txt
  • Im while Schleife, weisen Sie read an Befehl zum Lesen von Eingaben aus einem Dateideskriptor durch Angabe von -u Argument und die Dateideskriptornummer.

Wichtig: Verwenden Sie bei der Angabe von Dateideskriptoren eine Zahl zwischen 4 und 9, um Konflikte mit den internen Dateideskriptoren der Shell zu vermeiden.

  • Der printf Der Befehl behandelt die Eingabe $line Variable als String (%s ) und fügt ein Zeilenumbruchzeichen hinzu (\n ) nach dem Drucken der $line Inhalt.
  • Die 9< Syntax enthält dieselbe Dateideskriptornummer wie in while Schleife. Der Inhalt der Eingabedatei wird an den angegebenen Dateideskriptor gesendet.

3. Speichern Sie das Skript:

:wq

4. Führen Sie das Skript aus, um den Code zu testen:

bash descriptors.sh

Die Skriptausgabe gibt jede Zeile der Datei separat aus.

Methode 5:Prozesssubstitution verwenden

Die Prozesssubstitution lässt die Standardausgabe eines Prozesses (oder von Prozessen) als Datei erscheinen und speist sie in die Standardeingabe eines anderen Prozesses ein. Verwenden Sie die Prozessersetzung, um die Eingabedatei bereitzustellen, und drucken Sie jede Dateizeile separat.

Führen Sie die folgenden Schritte aus:

1. Erstellen Sie ein Bash-Skript:

vi substitution.sh

2. Geben Sie die folgenden Zeilen ein:

#!/bin/bash
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(cat days.txt)
  • Nach dem Schließen der Schleife, cat die in Klammern eingeschlossene Eingabedatei <(cat [input_file_path] um das Prozessergebnis an read zu senden Befehl.

Wichtig: Achten Sie darauf, keine Leerzeichen zwischen < einzufügen Zeichen und die linke Klammer ( . Die Verwendung eines Leerzeichens interpretiert den Code als Umleitung und führt zu einem Fehler.

3. Speichern Sie das Skript:

:wq

4. Führen Sie das Skript aus:

bash substitution.sh

Jede Dateizeile wird separat in der Standardausgabe ausgegeben.


Linux
  1. So löschen Sie Dateien und Verzeichnisse in Linux über die Befehlszeile

  2. So fügen Sie Textdateien unter Linux Zeilennummern hinzu

  3. So teilen und kombinieren Sie Dateien von der Befehlszeile in Linux

  4. Busy Box Datei zeilenweise lesen?

  5. Zeile für Zeile im Bash-Skript lesen

So kürzen Sie (leere) Dateien in Linux

So leiten Sie stderr in Bash auf stdout um

So benennen Sie eine Datei (en) in Linux um

Bash-Scripting:So lesen Sie Daten aus Textdateien

So finden Sie Dateien mit Dutzenden von Kriterien mit dem Bash-Suchbefehl

So komprimieren Sie eine Datei unter Linux