今天遇到有人要写一个从log里滚动读取最新条目并且根据是否有前置空格输出到终端的脚本,问我怎么判断每行的前置空格,我先给了他一个思路:
if [[ $(echo $line | cut -b 1) -eq " " ]];then
:
else
:
fi
过了一会,他说试过了,怎么改都不行,于是我让他把脚本全部贴出来(这里我略做了改动):
#!/bin/bash
#space.sh
service_log=1.txt
tail -f $service_log|while read line;do
if [[ $(echo $line|cut -c 1) -eq " " ]]
then
echo $line
fi
done
乍一看是没什么问题的,我试着运行了一下,做了一个1.txt:
#1.txt
1111111
22222
3333
输出的结果是这样的:
[root@test ~]# bash space.sh
■
“■”处是光标
奇怪了,为什么明明有空格却不输出第二第三行呢。。。
if判断的逻辑肯定是没问题的,那么问题大概就出在read的过程了,于是百度了一下,果然,shell脚本中默认的IFS(内部域分隔符)是空白,所以read到的line中的空白都被替换掉,这是bash中对IFS为空白(空格,制表符,换行符)时的处理。
教材中对
$IFS
的说明可以归纳如下:
于是在space.sh里面加了一条语句:
IFS=#
#任意非空的字符,确保不会出现在1.txt中
完整的脚本:
#!/bin/bash
#space.sh
service_log=1.txt
IFS=#
tail -f $service_log|while read line;do
if [[ $(echo $line|cut -c 1) -eq " " ]]
then
echo $line
fi
done
运行结果如下:
[root@test ~]# bash space.sh
22222
3333
■
效果不错。