Skip to main content

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

MethodSpeedBest ForComplexity
while read loopVery fastProcessing linesSimple
mapfileFastestLoading entire fileSimple
while read (no IFS=)Very fastStandard parsingSimple
cat + loopSlowerSimple scriptsModerate
sed/awkFastPattern-basedModerate

Bottom line: Use while IFS= read -r for reliable line processing.


Read files line by line in Bash for processing.

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

MethodSpeedNotes
while readFastNo subshell
cat | whileSlowerSubshell created
for loopMediumLoads 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 -r to prevent backslash interpretation
  • Use < filename to redirect file into loop
  • Avoid pipes (slower, uses subshell)
while IFS= read -r line; do
  # Process $line
  echo "$line"
done < "$input_file"