仓酷云

标题: 来一发shell逐行读取文件的*** [打印本页]

作者: 精灵巫婆    时间: 2015-1-14 20:17
标题: 来一发shell逐行读取文件的***
欢迎大家来到仓酷云论坛!在Linux中有良多***逐行读取一个文件的***,个中最经常使用的就是上面的剧本里的***,并且是效力最高,利用最多的***。为了给人人一个直不雅的感觉,我们将经由过程天生一个年夜的文件的体例来查验各类***的实行效力。
***1:while轮回中实行效力最高,最经常使用的***。

functionwhile_read_LINE_bottm(){
WhilereadLINE
do
echo$LINE
done<$FILENAME
}

正文:我习气把这类体例叫做read釜底抽薪,由于这类体例在停止的时分必要实行文件,就仿佛是实行完的时分再把文件读出来一样。

***2:重定向法;管道法:cat$FILENAME|whilereadLINE

FunctionWhile_read_LINE(){
cat$FILENAME|whilereadLINE
do
echo$LINE
done
}
正文:我只一切把这类体例叫做管道法,比拟人人应当能够看出来了吧。当碰见管道的时分管道右边的下令的输入会作为管道右侧下令的输出然后被输出出来。

***3:文件形貌符法

Functionwhile_read_line_fd(){
Exec3<&0
Exec0<$FILENAME
WhilereadLINE
Do
Echo$LINE
Exec0<&<3
}

正文:这类***分2步调,第一,经由过程将一切内容重定向到文件形貌符3来封闭文件形貌符0.为此我们用了语法Exec3<&0。第二部将输出文件放送到文件形貌符0,即尺度输出。

***4for轮回。

functionfor_in_file(){
Foriin`cat$FILENAME`
do
echo$i
done
}
正文:这类体例是经由过程for轮回的体例来读取文件的内容比拟人人很熟习了,这里未几说。


对各个***举行测试,看那***的实行效力最高。

起首我们用剧本(剧本见附件)天生一个70000行的文件,文件地位在/scripts/bigfile。然后经由过程上面的剧本来测试各个***的实行效力,剧本很复杂,不再注释。

#!/bin/bash
FILENAME="$1"
TIMEFILE="/tmp/loopfile.out">$TIMEFILE
SCRIPT=$(basename$0)

functionusage(){
echo-e"
USAGE:$SCRIPTfile
"


exit1
}

functionwhile_read_bottm(){

whilereadLINE
do
echo$LINE

done<$FILENAME

}

functionwhile_read_line(){

cat$FILENAME|whilereadLINE
do
echo$LINE
done

}

functionwhile_read_line_fd(){

exec3<&0
exec0<$FILENAME
whilereadLINE
do
echo$LINE
done
exec0<&3
}

functionfor_in_file(){
foriin`cat$FILENAME`
do
echo$i
done
}

if[$#-lt1];then
usage
fi
echo-e"
startingfileprocessingofeachmethod
"

echo-e"method1:"
echo-e"functionwhile_read_bottm"
timewhile_read_bottm>>$TIMEFILE

echo-e"
"


echo-e"method2:"
echo-e"functionwhile_read_line"
timewhile_read_line>>$TIMEFILE

echo-e"
"

echo-e"method3:"
echo"functionwhile_read_line_fd"
timewhile_read_line_fd>>$TIMEFILE

echo-e"
"

echo-e"method4:"
echo-e"functionfor_in_file"
timefor_in_file>>$TIMEFILE

实行剧本后:[root@localhostshell]#./while/scripts/bigfile
剧本输入内容:
method1:
functionwhile_read_bottm

real0m5.689s
user0m3.399s
sys0m1.588s


method2:
functionwhile_read_line

real0m11.612s
user0m4.031s
sys0m4.956s


method3:
functionwhile_read_line_fd

real0m5.853s
user0m3.536s
sys0m1.469s


method4:
functionfor_in_file

real0m5.153s
user0m3.335s
sys0m1.593s


上面我们对各个***依照速率举行排序。
real0m5.153smethod4(for轮回法)
real0m5.689smethod1(while釜底抽薪法)
real0m5.853smethod3(标识符法)
real0m11.612smethod2(管道法)

因而可知在各个***中,for语句效力最高,而在while轮回中读写文件时,
whilereadLINE
do
echo$LINE

done<$FILENAME
体例实行效力最高。


欢迎大家来到仓酷云论坛!
作者: 小妖女    时间: 2015-1-15 16:00
标题: 来一发shell逐行读取文件的***
为保住菊花,这个一定得回复!
作者: 灵魂腐蚀    时间: 2015-1-25 20:45
一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。
作者: 莫相离    时间: 2015-2-4 12:58
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
作者: 因胸联盟    时间: 2015-2-9 22:46
放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。
作者: 深爱那片海    时间: 2015-2-28 07:32
请问谁有Linux的学习心得的吗?简单的说说?
作者: 简单生活    时间: 2015-3-17 08:09
随着实验课程的结束,理论课也该结束了,说实话教OS的这两位老师是我们遇到过的不错的老师(这话放这可能不太恰当).
作者: 再见西城    时间: 2015-3-24 06:37
以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2