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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM