How to Read File Line by Line in Bash
• 1 min read
bash file operations file reading line by line
Quick Answer: Read File Line by Line in Bash
To read a file line by line in Bash, use a while loop with the read command: while IFS= read -r line; do ... done < filename.txt. The IFS= preserves whitespace, and -r prevents interpretation of backslashes.
Quick Comparison: File Reading Methods
| Method | Speed | Best For | Complexity |
|---|---|---|---|
| while read loop | Very fast | Processing lines | Simple |
| mapfile | Fastest | Loading entire file | Simple |
| while read (no IFS=) | Very fast | Standard parsing | Simple |
| cat + loop | Slower | Simple scripts | Moderate |
| sed/awk | Fast | Pattern-based | Moderate |
Bottom line: Use while IFS= read -r for reliable line processing.
Read files line by line in Bash for processing.
Method 1: Using while read Loop (Recommended)
while IFS= read -r line; do
echo "Line: $line"
done < filename.txt
Method 2: Using read without IFS Modification
while read -r line; do
echo "Processing: $line"
done < data.txt
Method 3: Reading Specific Columns
while IFS=',' read -r name age email; do
echo "Name: $name, Age: $age"
done < data.csv
Method 4: Using cat and pipe
cat filename.txt | while read -r line; do
echo "Line: $line"
done
Practical Examples
Count Lines in File
count=0
while IFS= read -r line; do
count=$((count + 1))
done < file.txt
echo "Total lines: $count"
Process CSV File
while IFS=',' read -r id name email; do
echo "User: $name ($email)"
done < users.csv
Skip Header Line
while IFS= read -r line; do
# Skip first iteration
[ -z "$header" ] && { header=1; continue; }
echo "$line"
done < data.csv
Filter Lines
while IFS= read -r line; do
# Skip empty lines
[ -z "$line" ] && continue
# Skip comments
[[ "$line" =~ ^# ]] && continue
echo "$line"
done < config.txt
Modify and Write
while IFS= read -r line; do
# Convert to uppercase
echo "${line^^}"
done < input.txt > output.txt
Line with Whitespace
# Preserve leading/trailing whitespace
while IFS= read -r line; do
echo "[$line]"
done < file.txt
Performance Comparison
| Method | Speed | Notes |
|---|---|---|
| while read | Fast | No subshell |
| cat | while | Slower | Subshell created |
| for loop | Medium | Loads entire file |
Use while IFS= read -r for best performance.
Debugging
# Show what's being read
while IFS= read -r line; do
echo "DEBUG: '$line'"
done < file.txt
Key Points
- Use
IFS=to preserve whitespace - Use
-rto prevent backslash interpretation - Use
< filenameto redirect file into loop - Avoid pipes (slower, uses subshell)
Recommended Pattern
while IFS= read -r line; do
# Process $line
echo "$line"
done < "$input_file"