0%

shell逐行处理文本

  • toc
    {:toc}

IFS

在弄清楚循环语句前,先看看字段分隔符的作用。
字段分隔符(Internal Field Separator, IFS)是shell脚本中的一个重要概念
处理文本数据的时候非常的有用,
是把单个数据流划分成不同数据元素的定界符。
系统环境默认的IFS是空白字符(换行符、制表符或者空格)

当 shell 处理”命令替换”和”参数替换”时,
shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,
然后对特殊字符进行处理,最后重新组合赋值给该变量。

以下是值得注意的地方:

  1. IFS is the space, tab, and newline characters by default,连续多个空白被看做一个处理
  2. $* 使用IFS中的第一个字符作为分隔符,把参数连接
  3. awk中的FS(域分隔符)也和IFS有类似的用法和作用

查看IFS值

> echo -n "$IFS" | od -ab
0000000  sp  ht  nl nul
        040 011 012 000
0000004

while read line

cat $FILE | while read line
do
    echo ">> ${line}"
done

echo ""

while read line
do
    echo ">> ${line}"
done < $FILE

while IFS='' read line
do
    echo ">> ${line}"
done < $FILE

awk

cat $FILE | awk '{print $0}'
cat $FILE | awk '{for(i=2;i<NF;i++) {printf $i} printf "\n"}'

for var in file

for var in file 表示变量var在file中循环取值.取值的分隔符由$IFS确定

IFS="
"

for line in $(cat $FILE)
do 
    echo ">> ${line}"
done

for line in `cat $FILE`
do 
    echo ">> ${line}"
done

  1. 逐行读取文本文件的 shell 脚本
  2. Shell中的 IFS