Reading input from files

Now, it may seem that these loops can do a little more than just count down numbers. We may want to read data in from a text file and process each line. The shell built-in read command that we saw earlier in this book can be used to read a file line by line. In this way, we can use a loop to process each line of a file.

To demonstrate some of these functionalities, we will use a file that contains the server addresses. These could be hostnames or IP addresses. In the following example, we will make use of the IP addresses of Google DNS Servers. The following command shows the contents of the servers.txt file:

$cat servers.txt
8.8.8.8
8.8.4.4

Using the read command in the condition of the while loop, we can loop as long as we have more lines to read from the file. We specify the input file directly after the done keyword. For each line that we read from the file, we can test if the server is up with the command ping and if the server is responding, we append it to a list of available servers. This list is printed once the loop closes. In the following example, we can see that we begin to add in as many elements of scripting as we have covered in this book:

$ while read server ; do
ping -c1 $server && servers_up="$servers_up $server"
done < servers.txt
echo "The following servers are up: $servers_up"

We can verify the operation in the following screenshot, which captures the output:

Reading input from files

Using this kind of loop, we can start to build extremely practical scripts to process information either fed from the command line or from scripts. It will be very easy to replace the filename that we read with $1 representing a positional parameter passed into the script. Let's return to the ping_server.sh script and adjust it to accept the input parameter. We can copy the script to the new $HOME/bin/ping_server_from_file.sh file. Within the script we first test if the input parameter is a file. We then create an output file with a tile that includes the date. As we enter the loop, we append available servers to this file and list the file at the end of the script:

#!/bin/bash
# Author: @theurbanpenguin
# Web: www.theurbapenguin.com
# Script to ping servers from file
# Last Edited: August 2015
if [ ! -f"$1 ] ; then
  echo "The input to $0 should be a filename"
  exit 1
fi
echo "The following servers are up on $(date +%x)"> server.out
done
while read server
do
  ping -c1 "$server"&& echo "Server up: $server">> server.out
done
cat server.out

We can execute the script now in the following manner:

$ ping_server_from_file.sh servers.txt

The output from the script execution should be similar to the following screenshot:

Reading input from files
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.139.83.151