在Linux中有很多方法逐行讀取一個(gè)文件的方法祭埂,其中最常用的就是下面的腳本里的方法趴捅,而且是效率最高套硼,使用最多的方法卡辰。
為了給大家一個(gè)直觀的感受,我們將通過生成一個(gè)大的文件的方式來檢驗(yàn)各種方法的執(zhí)行效率邪意。
一九妈、方法說明
方法1:while循環(huán)法
##############################
function while_read_bottom() {
? ? while read LINE
? ? do
? ? ? ? echo $LINE
? ? done < $FILENAME
}
###############################
注釋:我習(xí)慣把這種方式叫做read釜底抽薪,因?yàn)檫@種方式在結(jié)束的時(shí)候需要執(zhí)行文件雾鬼,就好像是執(zhí)行完的時(shí)候再把文件讀進(jìn)去一樣萌朱。
方法2 : 管道法
############################
function while_read_line() {
? ? cat $FILENAME | while read LINE
? ? do
? ? ? ? echo $LINE
? ? done
}
############################
注釋:我之所有把這種方式叫做管道法,相比大家應(yīng)該可以看出來了策菜。
當(dāng)遇見管道的時(shí)候管道左邊的命令的輸出會(huì)作為管道右邊命令的輸入然后被輸入出來晶疼。
方法3: 文件描述符法
#############################
function while_read_line_fd() {
? ? exec 3<&0
? ? exec 0< $FILENAME
? ? while read LINE
? ? do
? ? ? ? echo $LINE
? ? done
? ? exec 0<&3
}
##############################
注釋: 這種方法分2步驟
第一,通過將所有內(nèi)容重定向到文件描述符3來關(guān)閉文件描述符0又憨,為此我們用了語法 exec 3<&0 翠霍。
第二,將輸入文件放送到文件描述符0蠢莺,即標(biāo)準(zhǔn)輸入寒匙。
方法4:for ?循環(huán)
############################
function for_in_file() {
? ? for i in? `cat $FILENAME`
? ? do
? ? ? ? echo $i
? ? done
}
##############################
注釋:這種方式是通過for循環(huán)的方式來讀取文件的內(nèi)容相比大家很熟悉了,這里不多說浪秘。
二蒋情、效率測(cè)試
#? cat? ?time-test.sh
#######################################
#!/bin/bash
FILENAME="$1"
TIMEFILE="/tmp/loopfile.out" > $TIMEFILE
SCRIPT=$(basename $0)
function usage() {
? ? echo -e "\nUSAGE: $SCRIPT file \n"
? ? exit 1
}
function while_read_bottom() {
? ? while read LINE
? ? do
? ? ? ? echo $LINE
? ? done < $FILENAME
}
function while_read_line() {
? ? cat $FILENAME | while read LINE
? ? do
? ? ? ? echo $LINE
? ? done
}
function while_read_line_fd() {
? ? exec 3<&0
? ? exec 0< $FILENAME
? ? while read LINE
? ? do
? ? ? ? echo $LINE
? ? done
? ? exec 0<&3
}
function for_in_file() {
? ? for i in? `cat $FILENAME`
? ? do
? ? ? ? echo $i
? ? done
}
if [ $# -lt 1 ]; then
? ? usage
fi
echo -e " \n starting file processing of each method\n"
echo -e "method 1:"
echo -e "function while_read_bottom"
time while_read_bottom >> $TIMEFILE
echo -e "\n"
echo -e "method 2:"
echo -e "function while_read_line "
time while_read_line >> $TIMEFILE
echo -e "\n"
echo -e "method 3:"
echo "function while_read_line_fd"
time while_read_line_fd >> $TIMEFILE
echo -e "\n"
echo -e "method 4:"
echo -e "function? for_in_file"
time? for_in_file >> $TIMEFILE
##########################################
首先我們用命令生成一個(gè)10萬行的文件 test.txt
#? for i? in? {1..100000}; do? echo $i? >> test.txt;? done??
對(duì)各個(gè)方法進(jìn)行測(cè)試埠况,看那方法的執(zhí)行效率最高。
# ./time-test.sh test.txt
可以看出棵癣,在各個(gè)方法中辕翰,for語句效率最高。
三狈谊、參考
Linux shell逐行讀取文件的方法
https://blog.51cto.com/laoxu/1273840
https://www.cnblogs.com/f-ck-need-u/p/7431578.html
shell 中while read語句總結(jié)
https://blog.csdn.net/suofeng1234/article/details/51790110
https://www.cnblogs.com/centos-python/articles/8776217.html
Linux while read line
https://blog.csdn.net/roler_/article/details/17504039
http://www.360doc.com/content/15/0504/13/13670635_467863612.shtml
while read line in shell script - how to stop the loop?
https://unix.stackexchange.com/questions/253696/while-read-line-in-shell-script-how-to-stop-the-loop