Home Learn Linux How to read a file line by line in Bash

How to read a file line by line in Bash

by Abraham
bash read file line by line

A loop is a set of instructions in computer programming that is continuously repeated until a given condition is met. Suppose the condition is met, then the loop exits. In most cases, a specific operation is carried out, such as retrieving an item of data and modifying it. Then some condition, such as determining whether or not a counter has reached a predetermined number, is examined.

Bash is a command line interpreter, meaning it usually runs in a text window and allows the user to understand instructions to carry out various tasks. A Shell Script combines these commands in the form of a sequence contained within a file. The commands included in a Shell Script can be read by Bash, which will then carry them out.

When creating Bash scripts, you will inevitably run into circumstances where you need to read a file line by line at some point. You might, for instance, have a text file on your computer that contains data that needs to be processed by the script.

Read a file line by line in Bash

This article guide will cover the basics of reading a file line by line using the Bash shell. How would you construct a Bash script capable of processing a text file line-by-line? To begin, you will need a syntax and method to read the file one line at a time. In this tutorial, the ways used for this approach are shown.

Assume that you have a text file with the name fosslinux.txt that contains a list of the authors. The following content can be found within this file.

Abraham

Enock

Mercy

Rutto

Masai

With this info, now let us check some of the examples that can explain this subject matter:

Example 1: Using a script to read the file contents

To read the contents of a certain file, you will need to create a bash file and add the following code to it. In this case, the name of an existing file is saved in the $filename variable, and the value of the line number in that file is maintained in the $n variable. The while loop is used to read the file containing the line numbers.

#!/bin/bash

filename='fosslinux.txt'

n=1

while read line; do

# read each line

echo "Line No. $n : $line"

n=$((n+1))

done < $filename
use script ro read file contents

use script to read file contents

To execute the script’s instructions, run the following command:

bash fosslinux.sh
execute scripts instructions

Execute scripts instructions

The original content of the fosslinux.txt file can be viewed by executing the ‘cat’ command with the fosslinux.txt file.

cat fosslinux.txt
check original file content

Check original file content

Example 2: Read the file contents from the command line

Let’s say you don’t want to use the ‘cat’ command and instead want to read the company.txt file line by line from the command prompt. To complete the task, run the command that is listed below. The while loop will read each line from the fosslinux.txt file at each step. The contents of each line will be stored in a variable called $line, which will be printed later.

while read line; do echo $line; done < fosslinux.txt
read file contents from commandline

Read file contents from the command line

Example 3: Use the read command and the while loop to read a file line by line

When we want to read the contents of a file one line at a time, we can use the read command. We pass the -r parameter to the read command to prevent any characters from being backslash-escaped.

#!usr/bin/env bash

file="fosslinux.txt"

while read -r line; do

    echo -e "$line\n"

done <$file
while loop to read file line by line

while loop to read file line by line

In the above example, we can see that we are iterating over a file line by line and storing the contents of a single line in a variable referred to as “line.” The variable file is where the file’s name is saved, and this information can be altered to suit individual needs. You may put the script into action by typing in the following command:

bash fosslinux.sh
read a file line by line

Read a file line by line

Note: Change the fosslinux.sh to the actual name you gave to your script.

To read the file’s contents without escaping the backslash character, we use the read command with the -r parameter. Inside the while loop, we read the text of each line and store it in the variable line. Then, we use echo with a formatted -e parameter to display the contents of the line variable. This allows us to use special characters like n.

You can alternatively input the file by parsing it as a positional parameter. This is another option.

bash fosslinux.sh filename

You are free to choose whatever filename you want to read the contents of as the filename. You will need to adjust the script containing the variable declaration for the file.

file=$1

This will utilize the name of the first parameter after the script name as the name of the file used in the script. As a result, we can instruct the script to perform dynamic changes to the file based on the provided input.

Example 4: Bypassing the filename via the command line

Make a file in the bash scripting language and add the following script. This script will get the filename from the argument given on the command line. The first case value is read by the variable $1, which will then contain the name of the file to be read. The while loop will then read the file line by line, similar to the example that came before it, and print out whatever is contained in the file if it is present at the current place.

#!/bin/bash

filename=$1

while read line; do

# read each line

echo $line

done < $filename
pass filename via the terminal

Pass filename via the terminal

Execute the script that was just shown with the file fosslinux.txt set as the argument value. After deleting any unnecessary space, the output will display the contents of the fosslinux.txt file. The ‘cat’ command enables you to display the fosslinux.txt file’s contents in their original format.

bash fosslinux.sh fosslinux.txt

cat fosslinux.txt
execute script by passing filename in terminal

execute the script by passing the filename in terminal

Read Commands

-a array - Assign the words to read to consecutive indexes in the array variable ARRAY, beginning with 0.

-d delim - Rather than a newline, continue reading until the first character of DELIM is read.

e - To acquire the line, use Readline.

-i text - Readline should begin with the content provided in TEXT.

-n nchars - Instead of waiting for a newline, return after reading NCHARS characters but respect a delimiter if fewer than NCHARS characters were read before the delimiter.

-N nchars - Return only after reading precisely NCHARS characters, disregarding any delimiters, unless EOF is found or the read timer expires.

-p prompt - Before reading, output the string PROMPT without a trailing newline.

-r – Don't allow characters to escape through backslashes.

-s - Do not repeat the input from a terminal.

-t timeout - If a whole line of input is not read within TIMEOUT seconds, time out and return failure. The TMOUT variable represents the default timeout. TIMEOUT can accept fractional values. If TIMEOUT is set to zero, read returns immediately without attempting to read any data and only returns success if the input is available on the provided file descriptor. Upon exceeding the timeout, the exit status is larger than 128.

-u fd - Instead of standard input, read from file descriptor FD.

Conclusion

As a result of the examples presented above, we could use a BASH script to read the contents files one line at a time. This article also covered the useful read commands one can use to read a file in Bash. I hope you found this article guide helpful. Please let us know your encounter in the comments section below.

You may also like

Leave a Comment

fl_logo_v3_footer

ENHANCE YOUR LINUX EXPERIENCE.



FOSS Linux is a leading resource for Linux enthusiasts and professionals alike. With a focus on providing the best Linux tutorials, open-source apps, news, and reviews written by team of expert authors. FOSS Linux is the go-to source for all things Linux.

Whether you’re a beginner or an experienced user, FOSS Linux has something for everyone.

Follow Us

Subscribe

©2016-2023 FOSS LINUX

A PART OF VIBRANT LEAF MEDIA COMPANY.

ALL RIGHTS RESERVED.

“Linux” is the registered trademark by Linus Torvalds in the U.S. and other countries.