文章1部分 再了解C语言

shell脚本中的文件操作

【文章摘要】

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

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

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

【关键词】

shell  文件操作  读写  效率

一、概述

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

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXpoYW94aW9uZzEyMjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图1 文件比較算法的流程

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

1. sed逐行读取数据

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

(1) 读取方法

举例:读取f1文件的第一行:小节中的原因分析)。

2. 运用exec及read读取文件内容

(1) 打开读文件句柄

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

(2) 读取一行数据

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

(3) 关闭文件句柄

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

測试结果例如以下:

(1) 測试文件内容行数

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

122880 Test1

行的文件耗时3秒,而sed方式逐行读取完一个4995行的数据须要13秒。可见,运用exec及read后的文件读取效率有大幅的提升。

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

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

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

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

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

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

四、不同的写文件方式

主要有两种方式。

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

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

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

(1) 打开写文件句柄

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

(2) 写入一行数据

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

測试结果例如以下:

(1) 脚本运行结果

所看到的。

图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,欢迎关注!

)

让你提前知道软件开发(22):shell脚本文件操作的更多相关文章

  1. Shell脚本文件操作

    Linux Shell http://baike.baidu.com/link?url=2LxUhKzlh5xBUgQrS0JEc61xi761nvCS7SHJsa1U1SkVbw3CC869AoUC ...

  2. shell 脚本文件Windows传到Linux后编码问题

    shell 脚本文件Windows传到Linux后编码问题 下面这个标红的位置出现,是由于脚本从Windows机器上直接传到linux文件格式不对导致的. cat -v a.sh help^M exi ...

  3. 远程调用shell脚本文件和远程复制文件

    1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...

  4. 创建shell脚本文件

    简单来说脚本就是将需要执行的命令保存到文本中,按照顺序(由上往下执行),它是解释型的,不需要 编译 脚本格式 #!/bin/bash或者#!/bin/env bash开头 第一个shell脚本:hel ...

  5. 《Windows内核安全与驱动开发》4.1 文件操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...

  6. 自动化软件部署的shell脚本

    在实际项目中,我们经常用到需要自动化部署软件的情况,这种情况下,我们就不能人为地在命令行下敲击命令了,一切都需要通过shell脚本自动化完成.所谓自动化完成,其实也就是通过写shell程序,模拟人为敲 ...

  7. (让你提前知道软件开发33):数据操纵语言(DML)

    文章2部分 数据库SQL语言 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language,DML)包含insert.delete和update语句,用于增.删.改数据. ...

  8. iOS开发系列-Shell脚本编译SDK

    Library静态库Shell脚本 #!/bin/bash #要build的target名 target_Name="IFlyMSC" #编译模式 Release.Debug bu ...

  9. 【Shell脚本】运行shell脚本文件的几种方法与区别

    Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同. 假设现在有一个脚本名为display_shell_script_args.sh,其内容如下: #!/home/pyf/bin/ ...

随机推荐

  1. android ADT 设置编辑字体

    新配置的android ADT 设置编辑字体的时候  可能里面没有我们想要的Courier new 这种舒服的字体 那么就在 字体选项窗口的  做下端 有个显示更多字体的链接  然后就显示微软的所有字 ...

  2. android的JNI标准 android的NDK

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  3. KMP算法原理与实现(精简)

    思想:使源字符串中的下标不回溯,利用模式字符串自身的相关性,减少模式字符串中下标回溯的距离.从而减少比较的次数. 关键问题: 分析模式字符串,得出 部分匹配值数组. 原理参考此处. 具体实现: #in ...

  4. 转:python idle 清屏问题的解决

    http://www.cnblogs.com/maybego/p/3234055.html python idle 清屏问题的解决 在学习和使用python的过程中,少不了要与python idle打 ...

  5. Qt 多线程 详细函数说明及其事例

    转:http://www.cnblogs.com/hicjiajia/archive/2011/02/03/1948955.html Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了 ...

  6. dos批量替换当前目录后缀名

    有时候有些后缀名不满足条件,就需要进行批量的替换,如果人为的去替换,那么如果量少的话还好说,量多的话一个个去替换就太傻了,今天从网络上面查找了一些批量替换的dos命令,用起来还挺好用的,就直接把代码贴 ...

  7. static作用

    C程序一直由下列部分组成:      1)正文段——CPU运行的机器指令部分:一个程序仅仅有一个副本:仅仅读,防止程序因为意外事故而改动自身指令:      2)初始化数据段(数据段)——在程序中全部 ...

  8. 关于VC6编译LPDIRECT3D8不通过的问题

    重装了系统,打开以前的工程看看,重新编译发现类似的错误: error C2146: syntax error : missing ';' before identifier 'lpdi' fatal ...

  9. 节点地址的函数list_entry()原理详解

    本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...

  10. 论文阅读笔记 - Mesos: A Platform for Fine-Grained ResourceSharing in the Data Center

    作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 更多论文阅读笔记 http:/ ...