让你提前认识软件开发(22):shell脚本中的文件操作

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 第1部分 重新认识C语言shell脚本中的文件操作 【文章摘要】        编写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)如下:

#!/bin/sh
 
file="Test1"
file_row_count=`wc -l ${file} | awk '{print $1}'`
 
date
 
exec 3

 

       测试结果如下:

       (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)如下:

#!/bin/sh
 
str="Hello, world!"
cnt=1000000
 
date;
 
file="test3"
>${file}
i=0
while [ $i -lt $cnt ]
do
    echo "${str}">>${file}
    i=$((${i}+1))
done
 
date;
 
###################################
file="test4"
>${file}
exec 3>${file}
i=0
while [ $i -lt $cnt ]
do
    echo "${str}">&3
    i=$((${i}+1))
done
exec 3>&-
 
date;

        测试结果如下:

        (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秒时间是非常可观的,在大数据量下可进一步提升了程序执行效率。

 

五、总结

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

        本文比较了不同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,欢迎关注!)

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
3月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
133 1
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
79 2
6种方法打造出色的Shell脚本
|
2月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
93 1
|
2月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
86 2
|
3月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
71 6
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
92 12
|
3月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
114 2
|
4月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
4月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
883 2