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 anread
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 vonwhile
loop, gibt der echo-Befehl die$line
aus Inhalt der Variable. Das-e
Argument erlaubtecho
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 voncat
Befehl.
- Der
for
Schleife durchläuft jede Zeile voncat
Befehlsausgabe und druckt sie mitecho
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, dieIFS=
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 diecat
Befehlsausgabe anread
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 Sieread
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 inwhile
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 anread
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.