Bash
Czytasz plik (strumień danych, zmienna) wiersz po wierszu (i / lub pole po polu)?
Szukaj…
Parametry
Parametr | Detale |
---|---|
IFS | Separator pola wewnętrznego |
plik | Nazwa pliku / ścieżka |
-r | Zapobiega interpretacji ukośnika odwrotnego, gdy jest używany z odczytem |
-t | Usuwa końcowy znak nowej linii z każdej linii czytanej przez readarray |
-d DELIM | Kontynuuj, dopóki nie zostanie odczytany pierwszy znak DELIM (z read ), a nie nowa linia |
Czyta plik (/ etc / passwd) wiersz po wierszu i pole po polu
#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
echo "$username, $userid, $comment $homedir"
done < $FILENAME
W pliku hasła unix informacje o użytkowniku są przechowywane linia po linii, każda linia składa się z informacji dla użytkownika oddzielonych dwukropkiem (:). W tym przykładzie podczas odczytu pliku linia po linii linia jest również dzielona na pola przy użyciu znaku dwukropka jako separatora, co jest wskazywane przez wartość podaną dla IFS.
Przykładowe dane wejściowe
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
Przykładowe dane wyjściowe
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
Aby odczytać wiersz po wierszu i przypisać całą linię do zmiennej, poniżej znajduje się zmodyfikowana wersja przykładu. Zauważ, że mamy tutaj tylko jedną zmienną według linii nazwy.
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
Przykładowe dane wejściowe
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
Przykładowe dane wyjściowe
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
Wczytaj wiersze pliku do tablicy
readarray -t arr <file
Lub z pętlą:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
Pętla przez plik linia po linii
while IFS= read -r line; do
echo "$line"
done <file
Jeśli plik może nie zawierać nowego wiersza na końcu, to:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
Wczytaj wiersze łańcucha do tablicy
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
lub z pętlą:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
Pętla przez linię po linii
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
lub
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
Pętla przechodząca przez wyjście wiersza poleceń linia po linii
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
lub z rurą:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
Przeczytaj plik pole po polu
Załóżmy, że separatorem pól jest :
(dwukropek) w pliku pliku .
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
W przypadku treści:
first : se
con
d:
Thi rd:
Fourth
Dane wyjściowe to:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
Przeczytaj ciąg znaków pole po polu
Załóżmy, że separatorem pól jest :
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
Wynik:
-line-
- 1
line-
- 2
line3
-
Wczytaj pola pliku do tablicy
Załóżmy, że separatorem pól jest :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
Wczytaj pola ciągu do tablicy
Załóżmy, że separatorem pól jest :
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
Wynik:
newline
Zapętlanie danych wyjściowych pola polecenia po polu
Załóżmy, że separatorem pól jest :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
Lub za pomocą rury:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done