今天遇到有人要寫一個從log里滾動讀取最新條目并且根據(jù)是否有前置空格輸出到終端的腳本,問我怎么判斷每行的前置空格移怯,我先給了他一個思路:
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
乍一看是沒什么問題的裂垦,我試著運(yùn)行了一下,做了一個1.txt:
#1.txt
1111111
22222
3333
輸出的結(jié)果是這樣的:
[root@test ~]# bash space.sh
■
“■”處是光標(biāo)
奇怪了肌索,為什么明明有空格卻不輸出第二第三行呢蕉拢。。。
if判斷的邏輯肯定是沒問題的晕换,那么問題大概就出在read的過程了午乓,于是百度了一下,果然闸准,shell腳本中默認(rèn)的IFS(內(nèi)部域分隔符)是空白益愈,所以read到的line中的空白都被替換掉,這是bash中對IFS為空白(空格夷家,制表符蒸其,換行符)時的處理。
教材中對
$IFS
的說明可以歸納如下:
我要吐槽簡書的md不支持流程圖
于是在space.sh里面加了一條語句:
IFS=#
#任意非空的字符瘾英,確保不會出現(xiàn)在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
運(yùn)行結(jié)果如下:
[root@test ~]# bash space.sh
22222
3333
■
效果不錯枣接。