15.2.2 使用while按行读取文件

按行读取文件是while一个非常经典的用法,常用于处理格式化数据。比如说下面的一个用于记录学生信息的文件(读者自行创建,内容如下)。


  1. [root@localhost ~]# cat student_info.txt John 30 Boy Sue 28 Girl Wang 25 Boy Xu 23 Girl

仔细观察这个文件的内容不难发现,第一列是姓名,第二列是年龄,第三列是性别。利用while可按行读取的特性,依次打印学生信息。


  1. [root@localhost ~]# cat while04.sh #!/bin/bash

  2. while read LINE

  3. do

  4. NAME=`echo $LINE | awk '{print $1}'`

  5. AGE=`echo $LINE | awk '{print $2}'`

  6. Sex=`echo $LINE | awk '{print $3}'`

  7. echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"

  8. done < student_info.txt #

  9. 运行结果

  10. [root@localhost ~]# bash while04.sh My name is John, I'm 30 years old, I'm a Boy My name is Sue, I'm 28 years old, I'm a Girl My name is Wang, I'm 25 years old, I'm a Boy My name is Xu, I'm 23 years old, I'm a Girl


上面采用输入重定向的方式完成了文件读取,使用管道也可以完成同样的效果,如下所示:


  1. #while 使用管道的按行读取

  2. [root@localhost ~]# cat while04.sh #!/bin/bash

  3. cat student_info.txt | while read LINE

  4. do

  5. NAME=`echo $LINE | awk '{print $1}'`

  6. AGE=`echo $LINE | awk '{print $2}'`

  7. Sex=`echo $LINE | awk '{print $3}'`

  8. echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"

  9. done


虽然上面两段代码的功能看似一致,但这两种方式是有细微不同的:使用重定向符的while只会产生一个Shell,而使用管道的脚本在运行时会产生3个Shell,第一个Shell是cat(由于运行速度很快所以无法使用ps命令抓到),第二个Shell是管道,第三个Shell是while。