shell : 遍历文本每一行
【参考文章】:【Shell脚本】逐行处理文本文件
【参考文章】:Shell中的IFS解惑
1. read
这种方式处理时,如果在循环内操作全局变量,超过循环作用域后,对全局变量的操作就会失效。
比如把每一行文本添加到一个全局数组,在循环内数组添加的元素是正常的,在循环外数组的元素会恢复到循环之前的状态;
cat data.dat | while read line
do
echo "File:${line}"
done
这种方式处理时,如果在循环过程中执行某些命令,如 fab 命令,执行完命令后会直接跳出循环
while read line
do
echo "File:${line}"
done < data.dat
2. for var in file
2.1 IFS
这种方式处理时,var 取值由IFS(内部域分隔符)决定,默认为 space,tab,newline来拆解读入的变量。
#!/bin/bash
IFS_old=$IFS #将原IFS值保存,以便用完后恢复
IFS=$’\n’ #更改IFS值为$’\n’ ,注意,以回车做为分隔符,IFS必须为:$’\n’
do something
IFS=$IFS_old #恢复原IFS值
2.2 for var in file
这种方式遍历文本不会出现上述问题,推荐使用
for line in $(cat data.dat)
do
echo "File:${line}"
done
for line in `cat data.dat`
do
echo "File:${line}"
done
3. awk
处理文本时的逻辑比较复杂时一般用上述方式,如果只是简单的截取打印,则可以使用 awk 命令
传送门:Linux awk
如果文章对您有所帮助,可以点一下推荐