Bash
Eine Datei (Datenstrom, Variable) Zeile für Zeile (und / oder Feld für Feld) lesen?
Suche…
Parameter
Parameter | Einzelheiten |
---|---|
IFS | Internes Feldtrennzeichen |
Datei | Ein Dateiname / Pfad |
-r | Verhindert die Interpretation des Backslash, wenn er mit read verwendet wird |
-t | Entfernt aus jeder Zeile, die von readarray gelesen wird, eine nachgestellte Zeile |
-d DELIM | Fortfahren , bis das erste Zeichen von DELIM gelesen (mit read ), anstatt Newline |
Liest die Datei (/ etc / passwd) Zeile für Zeile und Feld für Feld
#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
echo "$username, $userid, $comment $homedir"
done < $FILENAME
In der Unix-Kennwortdatei werden Benutzerinformationen Zeile für Zeile gespeichert. Jede Zeile besteht aus Informationen für einen Benutzer, die durch einen Doppelpunkt (:) getrennt sind. In diesem Beispiel wird die Zeile beim Lesen der Datei Zeile für Zeile in Felder mit Doppelpunkt als Trennzeichen aufgeteilt, was durch den für IFS angegebenen Wert angegeben wird.
Probeneingang
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
Beispielausgabe
mysql, 27, MySQL Server /var/lib/mysql
pulse, 497, PulseAudio System Daemon /var/run/pulse
sshd, 74, Privilege-separated SSH /var/empty/sshd
tomcat, 91, Apache Tomcat /usr/share/tomcat6
webalizer, 67, Webalizer /var/www/usage
Um Zeile für Zeile zu lesen und die gesamte Zeile der Variablen zugewiesen zu haben, folgt eine modifizierte Version des Beispiels. Beachten Sie, dass hier nur eine Variable mit der Namenszeile angegeben wird.
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
Probeneingang
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
Beispielausgabe
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
Liest Zeilen einer Datei in ein Array
readarray -t arr <file
Oder mit einer Schleife:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
Durchlaufen Sie eine Datei Zeile für Zeile
while IFS= read -r line; do
echo "$line"
done <file
Wenn die Datei am Ende keine neue Zeile enthält, gilt Folgendes:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
Liest Zeilen eines Strings in ein Array
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
oder mit einer Schleife:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
Durchlaufen Sie einen String Zeile für Zeile
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
oder
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
Die Ausgabe eines Befehls zeilenweise durchlaufen
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
oder mit einer Pfeife:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
Lesen Sie eine Datei Feld für Feld
Nehmen wir an, das Feldtrennzeichen lautet :
(Doppelpunkt) in der Datei .
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
Für einen Inhalt:
first : se
con
d:
Thi rd:
Fourth
Die Ausgabe ist:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
Liest eine Zeichenfolge Feld für Feld
Nehmen wir an, das Feldtrennzeichen lautet :
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
Ausgabe:
-line-
- 1
line-
- 2
line3
-
Liest Felder einer Datei in ein Array
Nehmen wir an, das Feldtrennzeichen lautet :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
Liest Felder eines Strings in ein Array
Nehmen wir an, das Feldtrennzeichen lautet :
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
Ausgabe:
newline
Durchlaufen der Ausgabe eines Befehlsfelds für Feld
Nehmen wir an, das Feldtrennzeichen lautet :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
Oder mit einer Pfeife:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done