Bash
Leggi un file (flusso di dati, variabile) riga per riga (e / o campo per campo)?
Ricerca…
Parametri
Parametro | Dettagli |
---|---|
IFS | Separatore di campo interno |
file | Un nome di file / percorso |
-r | Impedisce l'interpretazione di backslash quando usato con read |
-t | Rimuove una nuova riga finale da ogni riga letta da readarray |
-d DELIM | Continua fino a leggere il primo carattere di DELIM (con read ), anziché newline |
Legge il file (/ etc / passwd) riga per riga e campo per campo
#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
echo "$username, $userid, $comment $homedir"
done < $FILENAME
Nel file di password di unix, le informazioni dell'utente vengono memorizzate riga per riga, ogni riga consiste di informazioni per un utente separate da due punti (:) carattere. In questo esempio durante la lettura del file riga per riga, la riga viene anche divisa in campi usando il carattere due punti come delimitatore indicato dal valore dato per IFS.
Esempio di input
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
Uscita di esempio
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
Per leggere riga per riga e avere l'intera riga assegnata alla variabile, di seguito è riportata una versione modificata dell'esempio. Si noti che abbiamo una sola variabile per linea di nome menzionata qui.
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
Ingresso di esempio
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
Uscita di esempio
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
Leggi le righe di un file in un array
readarray -t arr <file
O con un ciclo:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
Looping di un file riga per riga
while IFS= read -r line; do
echo "$line"
done <file
Se il file non può includere una nuova riga alla fine, quindi:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
Leggi le righe di una stringa in una matrice
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
o con un ciclo:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
Looping attraverso una stringa riga per riga
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
o
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
Ripetere l'output di una riga di comando per riga
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
o con una pipa:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
Leggi un file campo per campo
Supponiamo che il separatore di campo sia :
(due punti) nel file di file .
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
Per un contenuto:
first : se
con
d:
Thi rd:
Fourth
L'output è:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
Leggi una stringa campo per campo
Supponiamo che il separatore di campo sia :
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
Produzione:
-line-
- 1
line-
- 2
line3
-
Leggi i campi di un file in un array
Supponiamo che il separatore di campo sia :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
Leggere i campi di una stringa in una matrice
Supponiamo che il separatore di campo sia :
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
Produzione:
newline
Looping attraverso l'output di un campo di comando per campo
Supponiamo che il separatore di campo sia :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
O con una pipa:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done