Linux shell逐行读取文件的方法

简介:

在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。

方法1:while循环中执行效率最高,最常用的方法。
 
function while_read_LINE_bottm(){
 While read LINE
 do
echo $LINE
done  < $FILENAME
}
 
       
 
方法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
}
        
 
    对各个方法进行测试,看那方法的执行效率最高。
 
          首先我们用脚本(脚本见附件)生成一个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

方式执行效率最高。











本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1585224,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
28 3
|
1天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
10 1
|
1天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
7 1
|
1天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(24) 如何在Ubuntu中操作rootfs.img文件
Linux(24) 如何在Ubuntu中操作rootfs.img文件
2 0
|
6天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
12 0
|
8天前
|
Linux Shell 开发工具
Linux文件常用操作
Linux文件常用操作(几乎覆盖所有日常使用)
81 0
|
9天前
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
|
14天前
|
存储 Shell Linux
【攻防世界】unseping (反序列化与Linux bash shell)
【攻防世界】unseping (反序列化与Linux bash shell)
|
3天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
1天前
|
Ubuntu Linux Shell
linux免交互登陆远程主机并执行命令(密钥对和Expect)
linux免交互登陆远程主机并执行命令(密钥对和Expect)