zoukankan      html  css  js  c++  java
  • 让你提前知道软件开发(22):shell脚本文件操作

    文章1部分 再了解C语言

    shell脚本中的文件操作

     

    【文章摘要】

            编写shell脚本时,经常会涉及到对文件的操作,比方从文件里读取一行数据、向文件追加一行数据等。

    完毕文件读写操作的方法有非常多,了解各种命令下文件操作的运行情况,有助于开发者在不同使用场景下选择合适的命令。

           本文以实际的shell脚本为例,介绍了对文件进行操作的不同方法,为相关开发工作提供了參考。

    【关键词】

           shell  文件操作  读写  效率

     

    一、概述

            在某些软件项目的需求文档中,要求程序一次性读或写的数据规模较大,可达1000万行级,这就涉及到对程序运行方法和效率等的考虑。

            本文比較了不同shell命令在对文件进行读或写操作过程中运行效率的不同,为大数据下文件操作命令的选择提供了參考。

     

    二、文件比較算法流程介绍

            文件比較算法的流程如图1所看到的。

    1 文件比較算法的流程

     

    三、不同的文件内容读取命令

    1. sed逐行读取数据

            该命令在一个循环里,依次读取文件的每一行内容。

            (1) 读取方法

           举例:读取f1文件的第一行:sed n 1p f1

                      读取f1文件的第二行:sed n 2p f1

            该命令实现简单,逻辑清晰。

     

             (2) 性能问题

            假设用该命令进行大数据量(在十万数量级以上)的读取。发现程序运行效率低下。耗时较多(详细參见第3小节中的原因分析)

     

    2. 运用execread读取文件内容

            (1) 打开读文件句柄

            exec 3<testfile

            当中。3是文件描写叙述符(文件句柄),在linux取大于等于3的值(aix下仅仅能为[3,9]之间的值),该文描写叙述符兴许用来读取一行数据和关闭文件。testfile是要打开的文件。

             (2) 读取一行数据

             read str<&3

            当中,3表示从该文件描写叙述符读取数据;str是变量,用于保存从文件里读取的行数据。

            (3) 关闭文件句柄

              exec 3<&-

     

    3. sedexecread读取文件内容測试脚本及效率比較

             測试用execread方式逐行读取完一个122880行的文件,而用sed方式逐行读取完一个4995行的数据。測试脚本(命名为Test1.sh)例如以下:

     

           測试结果例如以下:

           (1) 測试文件内容行数

    zhou@linux:~/zhouzx/sh> wc -l Test1 Test2

    122880 Test1

      4995 Test2

    127875 total

     

           (2) 脚本运行结果

    zhou@linux:~/zhouzx/sh> ./Test1.sh

    Wed May 14 15:18:56 CST 2014

    Wed May 14 15:18:59 CST 2014

    Wed May 14 15:19:12 CST 2014

     

            从运行结果能够看出,用execread方式逐行读取完一个122880行的文件耗时3秒,而sed方式逐行读取完一个4995行的数据须要13秒。可见,运用execread后的文件读取效率有大幅的提升。

             (3) sed命令在大数据量(在十万数量级以上)下读取效率低下原因分析

             经分析,问题原因是sed命令读取一行数据太耗时。

             sed读取一行数据有两个耗时的地方:

             1) 每读取一行都会打开和关闭文件句柄,频繁的打开和关闭文件句柄成本高昂。

             2) sed读取某一行时有一个定位的过程,比方想要读取第10万行,则该命令运行时首先须要从头開始查找一直定位到第10万行,此种运行方式的成本也非常高。而且随着数据行数的添加成本不断地添加。

           上面的两个耗时的地方在仅仅运行一次sed命令读取一行数据时并不明显。但将该命令放在一个100万级的循环内,其效率问题就显得非常突出了。

     

    四、不同的写文件方式

            主要有两种方式。

    1. 运用>>向文件追加一行数据

            这是经常使用的操作方式。

     

    2. 运用exec方式向文件追加数据

            (1) 打开写文件句柄

             exec 3>testfile

            3是文件描写叙述符(文件句柄),在linux下取大于等于3的值(aix下仅仅能为[3,9]之间的值)。该文描写叙述符兴许用来读取一行数据和关闭文件;testfile是要打开的文件。

           (2) 写入一行数据

            echo “${str}”>&3

           3表示从该文件描写叙述符读取数据;str是变量。表示向文件描写叙述符写入的行数据。

           (3) 关闭写文件句柄

           exec 3>&-

     

    3. 写文件内容測试脚本及效率比較

            測试用>>方式向文件追加100万行数据,同一时候用exec方式向文件追加100万行数据,測试脚本(命名为Test2.sh)例如以下:


            測试结果例如以下:

            (1) 脚本运行结果

    zhou@linux:~/zhouzx/sh> ./Test2.sh

    Wed May 14 15:12:47 CST 2014

    Wed May 14 15:13:27 CST 2014

    Wed May 14 15:14:03 CST 2014

            (2) 生成文件内容

           生成文件test3test4中的内容全然同样,test3(test4)文件部分截图如图2所看到的。

    2 test3文件部分截图

             从运行结果能够看出。用>>方式向文件追加100万行数据耗时40秒。而用exec方式向文件追加100万行数据耗时36秒。用exec方式节约下来的4秒时间是非常可观的。在大数据量下可进一步提升了程序运行效率。

     

    五、总结

            提升程序运行效率是程序设计中一个永恒的话题,作为优秀的软件开发project师。一定要学会在已有程序的基础之上对算法进行优化。以提升程序及软件产品的运行效率。

            本文比較了不同shell命令在对文件进行读或写操作过程中运行效率的不同。并用脚本演示了不同命令运行时间的差距。通过对本文的阅读,希望大家能够对shell环境下文件操作有更为深刻的认识。

     

     

     

    (欢迎訪问南邮BBS:http://bbs.njupt.edu.cn/)
    (欢迎訪问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

    (本系列文章每周更新两篇,敬请关注!

    我的微博:http://weibo.com/zhouzxi?

    topnav=1&wvr=5。我们的聊天号码:245924426,欢迎关注!

    )

  • 相关阅读:
    Python环境的安装
    tar.xz如何解压:linux和windows下tar.xz解压命令介绍
    设置SVN忽略文件和目录(文件夹)
    C#【Thread】Interlocked 轻量级锁
    手把手教你做个AR涂涂乐
    理解UV贴图
    unity animation readonly 无法加事件?
    LUA Metatables
    增强现实阴影
    unity shader tags
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5046381.html
Copyright © 2011-2022 走看看