Bash
Läs en fil (dataström, variabel) rad-för-rad (och / eller fält-för-fält)?
Sök…
parametrar
Parameter | detaljer |
---|---|
IFS | Intern fältavskiljare |
fil | Ett filnamn / sökväg |
-r | Förhindrar tolkning av backslash när den används med läst |
-t | Tar bort en efterföljande ny linje från varje rad läst av readarray |
-d DELIM | Fortsätt tills DELIMs första tecken är läst (med read ), snarare än ny linje |
Läser fil (/ etc / passwd) rad för rad och fält för fält
#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
echo "$username, $userid, $comment $homedir"
done < $FILENAME
I unix-lösenordsfil lagras användarinformation rad för rad, varje rad består av information för en användare separerad med kolon (:) -tecken. I det här exemplet, medan du läser filen rad för rad, delas linjen också i fält med kolonstecken som avgränsare, vilket indikeras av värdet som ges för IFS.
Provinmatning
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
Provutgång
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
För att läsa rad för rad och ha hela raden tilldelad variabeln är följande en modifierad version av exemplet. Observera att vi bara har en variabel per namnrad som nämns här.
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
Provinmatning
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
Provutgång
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
Läs rader i en fil i en matris
readarray -t arr <file
Eller med en slinga:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
Looping genom en fil rad för rad
while IFS= read -r line; do
echo "$line"
done <file
Om filen kanske inte innehåller en ny linje i slutet, gör så:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
Läs linjer i en sträng i en matris
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
eller med en slinga:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
Looping genom en sträng rad för rad
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
eller
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
Looping genom utgången från en kommando rad för rad
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
eller med ett rör:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
Läs ett filfält för fält
Låt oss anta att fältseparator är :
(kolon) i Fil.
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
För ett innehåll:
first : se
con
d:
Thi rd:
Fourth
Utgången är:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
Läs ett strängfält för fält
Låt oss anta att fältavskiljaren är :
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
Produktion:
-line-
- 1
line-
- 2
line3
-
Läs fält i en fil i en matris
Låt oss anta att fältavskiljaren är :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
Läs fält i en sträng i en matris
Låt oss anta att fältavskiljaren är :
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
Produktion:
newline
Looping genom utgången från ett kommandofält för fält
Låt oss anta att fältavskiljaren är :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
Eller med ett rör:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done