Shell中的IFS分隔符使用

在linux中,shell把每个 $IFS 字符对待成一个分隔符,且基于这些字符把其他扩展的结果分割。

工作中需要处理一个文件datafile,文件中有好几列,列与列之间以‘\3′分割,如下(终端下’\3′显示为方块):

我需要拿到文件中第三列为1的数据行再做具体的处理,比如取其中的某一列数据再去其他文件grep数据等等。简单点,直接逐行cat数据吧。

脚本如下:

1
2
3
4
for line in `awk -F"\3" '{if($3==1) print $0}' datafile`
do
echo $line
done

结果如下:

本来是想要逐行打印出来的,可结果却不是我想要的,究其原因,是因为在shell的for循环中,列出集合的item时,默认是以为分隔符,我们的数据文件中有空格,因此它就以空格分割打印了。

可以通过显式设置IFS的值来达到我们要的效果,修改后的脚本如下:

1
2
3
4
5
6
7
oldifs=$IFS
IFS=$'\n' #change seperator to '\n' to get a line
for line in `awk -F"\3" '{if($3==1) print $0}' datafile`
do
echo $line
done
IFS=$oldifs #reset seperator

通过先保存当前的IFS变量的值到一个临时变量,再显式设置为我们想要的行分隔符$’\n’,然后在for循环结束后,再重置IFS的值即可。

结果如下:

热评文章