15.2.2 使用while按行读取文件
按行读取文件是while一个非常经典的用法,常用于处理格式化数据。比如说下面的一个用于记录学生信息的文件(读者自行创建,内容如下)。
- [root@localhost ~]# cat student_info.txt John 30 Boy Sue 28 Girl Wang 25 Boy Xu 23 Girl
仔细观察这个文件的内容不难发现,第一列是姓名,第二列是年龄,第三列是性别。利用while可按行读取的特性,依次打印学生信息。
- [root@localhost ~]# cat while04.sh #!/bin/bash
while read LINE
do
NAME=`echo $LINE | awk '{print $1}'`
AGE=`echo $LINE | awk '{print $2}'`
Sex=`echo $LINE | awk '{print $3}'`
echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"
done < student_info.txt #
运行结果
[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
上面采用输入重定向的方式完成了文件读取,使用管道也可以完成同样的效果,如下所示:
- #while 使用管道的按行读取
[root@localhost ~]# cat while04.sh #!/bin/bash
cat student_info.txt | while read LINE
do
NAME=`echo $LINE | awk '{print $1}'`
AGE=`echo $LINE | awk '{print $2}'`
Sex=`echo $LINE | awk '{print $3}'`
echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"
done
虽然上面两段代码的功能看似一致,但这两种方式是有细微不同的:使用重定向符的while只会产生一个Shell,而使用管道的脚本在运行时会产生3个Shell,第一个Shell是cat(由于运行速度很快所以无法使用ps命令抓到),第二个Shell是管道,第三个Shell是while。