Efficiency in Shell
最近在写一个shell脚本, 由于该脚本对效率有较高的要求, 所以查阅了一些文章. 感觉这篇文章写得确实不错, 文章中的例子,确实很棒! 所
以我把他们提取出来:
@1:实例:
需求:计算1到100000累加结果
方法1:采用bash shell的数值计算
# time for((i=0;i<=100000;i++)); do ((sum+=i)); done ; echo $sum
real 0m1.134s
user 0m1.080s
sys 0m0.048s
5000050000
方法2:采用awk的数值计算
# time awk 'BEGIN{while(i++<100000)sum+=i; printf "%d", sum;}'
5000050000
real 0m0.029s
user 0m0.020s
sys 0m0.000s
实例结果分析:同等的累加运算,采用shell的数值计算耗时1.134秒,采用awk工具只需要0.029秒。实验结果表明,适当的采用工具软件,
能够明显提高shell脚本的执行效率。
@2:实例: 正则效率。
需求:某文本以空格和/进行分隔,获取第五列的内容.
方法1:采用正则[ /]分别匹配二种分隔符,取得第五列
# time awk -F'[ /]' '{print $5}' a.txt >/dev/null
real 0m17.717s
user 0m14.749s
sys 0m2.844s
方法2:实际数据分析中发现,可以采用单字符解析的方式,首先根据“空格”分隔符取得第4列,再利用“/”分隔符取得第二列。
# time awk '{print $4}' a.txt |awk -F/ '{print $2}' >/dev/null
real 0m0.565s
user 0m0.224s
sys 0m0.688s
实例结果分析:awk采用-F指定分隔符,在多分隔符情况下,会启用正则去解析记录,增加了函数调用,和字符串匹配的消耗,效率上理所
当然的比不上默认的空格或单字符分隔符采用的简单的字符比较方式,尽管如此,方法2依赖于对需求的进一步分析,适用的需求范围没有
使用正则那么简便灵活。
@3:实例:sed应用,读取指定行
方法1:sed -n '45,50p' filename
方法2:sed -n '51q;45,50p' filename
实例结果分析:方法2在方法1基础上增加了一个判断,当文件读取到第51行时即时退出。避免文件后续部分的遍历,在大数据量处理上能
够很大的提高执行效率。
@4:实例:sed应用,文本替换
方法1:sed 's/foo/bar/g' filename
方法2:sed '/foo/ s/foo/bar/g' filename
实例结果分析:sed支持采用正则进行匹配和替换,考虑字符串替换的需求中,不防加上地址以提高速度。实例中通过增加一个判断逻辑,
采用“事先匹配”代替“直接替换”,由于sed会保留前一次的正则匹配环境,不会产生冗余的正则匹配,因此方法2具有比方法1更高
的效率
@5:awk的特色数据结构:哈希数组,也称关联数组。哈希数组中的每个单元包括二个元素:单元键(key)及单元值(values)。哈希结构
的效益体现在以较小的内存空间实现大的数据空间上的数据存放,节省了数据占存空间;同时哈希数组中的数据访问是随机访问,不需要
遍历而直接通过哈希函数直接访问数组单元取值,节省了数据查询时间。
Reference:
shell脚本效率: http://blog.csdn.net/yanook/article/details/8395482
Efficiency in Shell的更多相关文章
- I.MX6 working note for high efficiency
/**************************************************************************** * I.MX6 working note f ...
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- Shell特殊变量
$ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...
- shell变量
定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- shell简介
Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...
- Shell碎碎念
1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
随机推荐
- Mysql备份工具比较
Mysql备份工具比较 大 | 中 | 小 [ 2012/12/25 12:10 | by Sonic ] 1. 使用automysqlbackup http://sourceforge.net/pr ...
- centos 7 下安装haproxy
1 haproxy 下载 从如下目录下载haproxy:http://www.haproxy.org/download/1.7/src/haproxy-1.7.1.tar.gz 2 haproxy 安 ...
- Windows 下tomcat安装及将多个tomcat注册为Windows服务
一.应用场景 虽然Windows在当下已经不再是我们作为服务器操作系统平台的首选,但是还是有一些开发商或者项目整体需求的限制必须运行在Windows系统平台之下.为了避免多个应用部署在同一个tomca ...
- Android实现录屏直播(二)需求才是硬道理之产品功能调研
请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244 前面的Android ...
- Dynamic Web Project 的学习笔记
文章框架: 1.Dynamic Web Project 概念 2.eclipse 中的动态Web 项目与 Myeclipse 中的web项目有何区别 3.动态的运行原理及目录结构---是否都涉及到由 ...
- postman-变量/环境/过滤等
之前虽然自己也有用postman来测试api,但都只是最简单输入url,发送,查看结果,大部分时候跟使用浏览器差不多,偶然在简书首页看到一篇 API开发神器-Postman , 深感还是得对自己使用的 ...
- ASP.NET动态网站制作(28)-- 三层框架(2)
前言:三层框架的第二节课,继续上次课的内容. 内容: 1.三层框架的使用目的:可以将视图层和业务逻辑层及实体层分开,可以提高代码的扩展性,安全性,可以实现程序的低耦合性. 2.GetModel方法及G ...
- poj 1470(LCA)
题目链接:http://poj.org/problem?id=1470 思路:题目的意思很简单,就是求树中每个节点作为某两个节点的最近公共祖先的次数,这里我们可以用sum数组来保存,然后就是从根节点开 ...
- Android无线测试之—UiAutomator UiDevice API介绍二
按键与KEYCODE使用 一.手机常见按键: 1)HOME 主屏幕键 2) MENU 菜单键 3) BACK 返回键 4) VOLUME_UP 音量加键 5) VOLUME_DOWN 音量减键 6) ...
- 使用yum 出现 Loaded plugins: fastestmirror
使用yum 安装是出现 : Loaded plugins: fastestmirror [root@localhost yum.repos.d]# yum –y install httpd http ...