文档章节

Linux shell逐行读取文件的方法

wulei163
 wulei163
发布于 2013/12/30 16:24
字数 794
阅读 633
收藏 0

方法1:while循环中执行效率最高,最常用的方法。

 

function while_read_LINE_bottm(){
 While read LINE
 do
echo $LINE
done  < $FILENAME
}

 

        注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。

 

方法2 : 重定向法;管道法: cat $FILENAME | while read LINE

 

function While_read_LINE(){
 cat $FILENAME | while read LINE
 do 
echo $LINE
done
}

          注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。

 

方法3: 文件描述符法

Function while_read_line_fd(){
Exec 3<&0
Exec 0<$FILENAME
While read LINE
Do 
 Echo $LINE
 Exec 0<&<3
}

 

        注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。

  

方法4    for  循环。

function  for_in_file(){
For  i  in  `cat $FILENAME`
do
echo $i
done
}

注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。



对各个方法进行测试,看那方法的执行效率最高。

 

          首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。

 

#!/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_bottm(){
 
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_bottm"
 time while_read_bottm >> $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
 
    执行脚本后: [root@localhost shell]# ./while /scripts/bigfile 
脚本输出内容:
method 1:
function while_read_bottm
 
real    0m5.689s
user    0m3.399s
sys    0m1.588s
 
 
method 2:
function while_read_line 
 
real    0m11.612s
user    0m4.031s
sys    0m4.956s
 
 
method 3:
function while_read_line_fd
 
real    0m5.853s
user    0m3.536s
sys    0m1.469s
 
 
method 4:
function  for_in_file
 
real    0m5.153s
user    0m3.335s
sys    0m1.593s

 

 

下面我们对各个方法按照速度进行排序。

real    0m5.153s    method 4 (for 循环法)

real    0m5.689s    method 1  (while 釜底抽薪法)

real    0m5.853s    method 3    (标识符法)

real    0m11.612s  method 2    (管道法)

 

由此可见在各个方法中,for语句效率最高,而在while循环中读写文件时,

while read LINE
do
echo $LINE
done < $FILENAME


方式执行效率最高。



本文转载自:http://www.linuxidc.com/Linux/2012-11/73518.htm

共有 人打赏支持
wulei163
粉丝 8
博文 48
码字总数 8231
作品 0
郑州
程序员
Shell脚本:使用rsync备份文件/目录

本文我们介绍一个shell脚本,用来使用rsync命令将你本地Linux机器上的文件/目录备份到远程Linux服务器上。使用该脚本会以交互的方式实施备份,你需要提供远程备份服务器的主机名/ip地址和文件...

酱醋茶丶
2015/10/28
0
0
linux shell编程-逐行处理文本文件

  前言      在Linux shell编程中,我们经常需要以行为处理单位进行数据处理。   使用while read处理   read命令接收标准输入,或其他文件描述符的输入,得到输入后,read命令将数...

linux运维菜
08/10
0
0
oracle 11.2.0.3 设置启动脚本使ORACLE自动启动

Linux下安装完后每次都得通过下面命令来启动对应的服务: 启动服务 dbstart 启动监视器 lsnrctl start 启动控制台 emctl start dbconsole 本文以Red Hat Enterprise Linux 6.4 (x86_64)+oracl...

sfih
2016/01/29
0
0
shell:读取文件的每一行内容并输出

本文原创于:http://www.cnblogs.com/iloveyoucc/archive/2012/07/10/2585529.html shell:读取文件的每一行内容并输出 写法一: --------------------------------------------------------......

love8023icando
2016/09/06
0
0
Linux之shell编程函数使用

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项。 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6675421.html 微...

刘洋intsmaze
2017/04/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
2
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
33
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部