文章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 bitmap序列化

    最近在开发中需要用到图片bitmap的序列化并进行传递,发现bitmap是没有序列化的,下面是自己实现的一个序列化方法,分享下. 以下是通过byte[]来进行序列化的,因为bitmap是没有序列化的, ...

  2. IT忍者神龟之Oracle DBA经常使用查询吐血列举

    –1. 查询系统全部对象 select owner, object_name, object_type, created, last_ddl_time, timestamp, status from ...

  3. poj1573&amp;&amp;hdu1035 Robot Motion(模拟)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接: HDU:pid=1035">http://acm.hd ...

  4. TTimerThread和TThreadedTimer(都是通过WaitForSingleObject和CreateEvent来实现的)

    //////////////////////////////////////////////////// // // // ThreadedTimer 1.24 // // // // Copyrig ...

  5. Vim的常用命令笔记

    [简介] Vim是vi编辑器的改进版.vi是类UNIX系统里最常用的编辑器. [模式] 在shell中直接打vim filename就会进入普通模式.按i键进入编辑模式,此时Vim底部显示INSERT ...

  6. iphone开发教程下载

    iphone开发教程下载 3月份花了1个月研究ios 开发,看了几百页的iphone开发教程,累积了不少电子书,盘点一下 Beginning iPhone 4 Development: Explori ...

  7. HTML5 input placeholder 颜色 改动

    David Murdoch:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: CSS input[placeholder], [placeholder], ...

  8. Linux - Linux系统目录架构

    Linux系统目录架构   Bin: 保存的是二进制可执行文件,也就是我们所敲的那些命令. Boot: 引导目录,整个操作系统的引导启动都是在boot目录下面.最主要的文件是vmLinuz-……,内核 ...

  9. TCP/IP协议的编写《转载》

    基于HHARM9-EDU的TCP/IP(UDP)协议的实现 原文网址:http://blog.csdn.net/lhj0503/article/details/3323788 摘 要:嵌入式技术的发展 ...

  10. Spring MVC RedirectAttributes的用法解决办法

    Spring MVC RedirectAttributes的用法很久没发过技术贴了,今天对于一个问题纠结了2小时,遂放弃研究用另一种方法解决,奈何心中一直存在纠结,发帖求解 我先解释下什么是Redir ...