【time】Linux shell逐行讀取文件的方法和效率

在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


shell中while循環(huán)的陷阱

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喜命,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子河劝,更是在濱河造成了極大的恐慌壁榕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赎瞎,死亡現(xiàn)場(chǎng)離奇詭異牌里,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)务甥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門牡辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敞临,你說我怎么就攤上這事态辛。” “怎么了挺尿?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵奏黑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我编矾,道長(zhǎng)熟史,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任洽沟,我火速辦了婚禮以故,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裆操。我一直安慰自己怒详,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布踪区。 她就那樣靜靜地躺著昆烁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缎岗。 梳的紋絲不亂的頭發(fā)上静尼,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼鼠渺。 笑死鸭巴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拦盹。 我是一名探鬼主播鹃祖,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼普舆!你這毒婦竟也來了恬口?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤沼侣,失蹤者是張志新(化名)和其女友劉穎祖能,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾洛,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡养铸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧膘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭厚。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扶供,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裂明,我是刑警寧澤椿浓,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站闽晦,受9級(jí)特大地震影響扳碍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仙蛉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一笋敞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荠瘪,春花似錦夯巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篮绰,卻和暖如春后雷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工臀突, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勉抓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓候学,卻偏偏與公主長(zhǎng)得像藕筋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盒齿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354