【1】Shell腳本:while read line無法讀取最后一行的問題
剛剛利用shell腳本處理日志文件時,發現了一個問題:while read line無法讀取到最后一行
通過編輯器可以看到待處理的文件是5243行,但是,腳本的計數值卻只打印了5242次。
shell腳本源碼如下:
1 icount=0 2 while read line 3 do 4 data=`echo ${line#*error repeat sdr }` 5 callid=`echo ${data% error:mysql.*}` 6 let icount++ 7 echo "${icount}" 8 echo "${callid}" >> 2019-02-26-callid-test.txt 9 done < 2019-02-26-errorrepeat.txt
如上腳本。
【2】解決方案
方案一:
在利用while read line讀取文件時:
如果文件最后一行之后沒有換行符\n,則read讀取最后一行時遇到文件結束符EOF,循環即終止。
雖然,此時$line內存有最后一行,但程序已經沒有機會再處理此行內容。因此導致了這個問題發生。解決方案如下:
1 while read line || [[ -n ${line} ]]
這樣當文件沒有到最后一行時不會測試-n $line,當遇到文件結束(最后一行)時,仍然可以通過測試$line是否有內容來進行繼續處理。
上例子代碼如下改進:
1 icount=0 2 while read line || [[ -n ${line} ]] 3 do 4 data=`echo ${line#*error repeat sdr }` 5 callid=`echo ${data% error:mysql.*}` 6 let icount++ 7 echo "${icount}" 8 echo "${callid}" >> 2019-02-26-callid-test.txt 9 done < 2019-02-26-errorrepeat.txt
方案二:
通過分析原因可知,本質原因是因為文件格式不是unix導致的,也可以直接通過設置文件格式來處理。
如這樣處理,腳本代碼不需改動。
查詢文件格式和修改文件格式為unix,可參見隨筆《/usr/bin/python^M: 解釋器錯誤: 沒有那個文件或目錄》
Good Good Study, Day Day Up.
順序 選擇 循環 總結