【Shell指令碼】逐行處理文字檔案 && 空格變換行
經常會對文體檔案進行逐行處理,在Shell裡面如何獲取每行資料,然後處理該行資料,最後讀取下一行資料,迴圈處理.有多種解決方法如下:
1.通過read命令完成.
read命令接收標準輸入,或其他檔案描述符的輸入,得到輸入後,read命令將資料放入一個標準變數中.
利用read讀取檔案時,每次呼叫read命令都會讀取檔案中的"一行"文字.
當檔案沒有可讀的行時,read命令將以非零狀態退出.
1 cat data.dat | while read line 2 do 3 echo "File:${line}" 4 done 5 6 while read line 7 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 done 5 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的預設值為:空白(包括:空格,製表符,換行符).