仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 842|回复: 7
打印 上一主题 下一主题

[shell编程] 来一发shell逐行读取文件的***

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:17:32 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
欢迎大家来到仓酷云论坛!在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
体例实行效力最高。


欢迎大家来到仓酷云论坛!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-14 22:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表