Bash
Een bestand (gegevensstroom, variabel) regel voor regel (en / of veld voor veld) lezen?
Zoeken…
parameters
Parameter | Details |
---|---|
IFS | Intern veldscheidingsteken |
het dossier | Een bestandsnaam / pad |
-r | Voorkomt backslash-interpretatie bij gebruik met lezen |
-t | Hiermee verwijdert u een nieuwe regel uit elke regel die wordt gelezen door readarray |
-d DELIM | Ga door totdat het eerste teken van DELIM is gelezen (met read ), in plaats van een nieuwe regel |
Leest bestand (/ etc / passwd) regel voor regel en veld voor veld
#!/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 het Unix-wachtwoordbestand wordt gebruikersinformatie regel voor regel opgeslagen, waarbij elke regel bestaat uit informatie voor een gebruiker gescheiden door een dubbele punt (:). In dit voorbeeld wordt de regel bij het lezen van het bestand regel voor regel gesplitst in velden met een dubbele punt als scheidingsteken, wat wordt aangegeven door de waarde die is opgegeven voor IFS.
Voorbeeld invoer
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
Voorbeelduitvoer
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
Om regel voor regel te lezen en de hele regel aan variabele toe te wijzen, volgt hier een gewijzigde versie van het voorbeeld. Merk op dat we slechts één variabele op naamregel hebben die hier wordt vermeld.
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
Voorbeeld invoer
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
Voorbeelduitvoer
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
Lees regels van een bestand in een array
readarray -t arr <file
Of met een lus:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
Regel voor regel door een bestand bladeren
while IFS= read -r line; do
echo "$line"
done <file
Als het bestand aan het einde geen nieuwe regel bevat, dan:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
Lees lijnen van een string in een array
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
of met een lus:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
Lijn voor lijn door een string doorlussen
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
of
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
De uitvoer van een opdracht regel voor regel doorlopen
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
of met een pijp:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
Lees een bestand veld voor veld
Laten we aannemen dat het veldscheidingsteken :
(dubbele punt) in het bestand is .
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
Voor een inhoud:
first : se
con
d:
Thi rd:
Fourth
De output is:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
Lees een tekenreeks veld voor veld
Laten we aannemen dat het veldscheidingsteken is :
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
Output:
-line-
- 1
line-
- 2
line3
-
Lees velden van een bestand in een array
Laten we aannemen dat het veldscheidingsteken is :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
Lees velden van een string in een array
Laten we aannemen dat het veldscheidingsteken is :
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
Output:
newline
Veld voor veld door de uitvoer van een opdracht bladeren
Laten we aannemen dat het veldscheidingsteken is :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
Of met een pijp:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done