Read a file (data stream, variable) line-by-line (and/or field-by-field)?
Parameters#
| Parameter | Details |
|---|---|
| IFS | Internal field separator |
| file | A file name/path |
-r |
Prevents backslash interpretation when used with read |
-t |
Removes a trailing newline from each line read by readarray |
-d DELIM |
Continue until the first character of DELIM is read (with read), rather than newline |
| ## Reads file (/etc/passwd) line by line and field by field |
Read lines of a file into an array
readarray -t arr <fileOr with a loop:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <fileLooping through a file line by line
while IFS= read -r line; do
echo "$line"
done <fileIf file may not include a newline at the end, then:
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <fileRead lines of a string into an array
var='line 1
line 2
line3'
readarray -t arr <<< "$var"or with a loop:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"Looping through a string line by line
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"or
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
doneLooping through the output of a command line by line
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)or with a pipe:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
doneRead a file field by field
Let’s assume that the field separator is : (colon) in the file file.
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <fileFor a content:
first : se
con
d:
Thi rd:
FourthThe output is:
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**Read a string field by field
Let’s assume that the field separator 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
-Read fields of a file into an array
Let’s assume that the field separator is :
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <fileRead fields of a string into an array
Let’s assume that the field separator 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:
newlineLooping through the output of a command field by field
Let’s assume that the field separator is :
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)Or with a pipe:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done