Shell腳本:while read line無法讀取最后一行的問題


【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.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM