參考: http://www.cnblogs.com/dwdxdy/archive/2012/07/25/2608816.html
經常會對文體檔案進行逐行處理,在Shell裡面如何擷取每行資料,然後處理該行資料,最後讀取下一行資料,迴圈處理.有多種解決方案如下:
1.通過read命令完成.
read命令接收標準輸入,或其他檔案描述符的輸入,得到輸入後,read命令將資料放入一個標準變數中.
利用read讀取檔案時,每次調用read命令都會讀取檔案中的"一行"文本.
當檔案沒有可讀的行時,read命令將以非零狀態退出.
1 cat data.dat | while read line2 do3 echo "File:${line}"4 done5 6 while read line7 do 8 echo "File:${line}"9 done < data.dat
2.使用awk命令完成
awk是一種優良的文本處理工具,提供了極其強大的功能.
利用awk讀取檔案中的每行資料,並且可以對每行資料做一些處理,還可以單獨處理每行資料裡的每列資料.
1 cat data.dat | awk '{print $0}'2 cat data.dat | awk 'for(i=2;i<NF;i++) {printf $i} printf "\n"}'
第1行代碼輸出data.dat裡的每行資料,第2代碼輸出每行中從第2列之後的資料.
如果是單純的資料或文字檔的按行讀取和顯示的話,使用awk命令比較方便.
3.使用for var in file 命令完成
for var in file 表示變數var在file中迴圈取值.取值的分隔字元由$IFS確定.
1 for line in $(cat data.dat)2 do 3 echo "File:${line}"4 done5 6 for line in `cat data.dat`7 do 8 echo "File:${line}"9 done
如果輸入文本每行中沒有空格,則line在輸入文本中按分行符號分隔字元迴圈取值.
如果輸入文本中包括空格或定位字元,則不是換行讀取,line在輸入文本中按空格分隔字元或定位字元或分行符號特環取值.
可以通過把IFS設定為分行符號來達到逐行讀取的功能.
demo:
假設現需要讀取如下的檔案rollback_config.txt:
ROLLBACK_SERVICES:upserv checkserv
ROLLBACK_VERSION:v1.1
使用 for line in `cat rollback_config.txt`; do echo "${line}"; done 讀取的結果會是:
ROLLBACK_SERVICES:upserv
checkserv
ROLLBACK_VERSION:v1.1
顯然不是我們想要的。
解決方案:
IFS_old=$IFS
IFS=$'\n'
for line in `cat rollback_config`;do
echo "$line"
done;
IFS=$IFS_old
這樣一來就可以了。
IFS的預設值為:空白(包括:空格,定位字元,分行符號).