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界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
随机推荐
- sigaction()之sa_mask
man文档描述: sa_mask gives a mask of signals which should be blocked during execution of the signal hand ...
- 2017-5-14 湘潭市赛 Similar Subsequence 分析+四维dp+一些简单优化
Similar Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Similar Subsequence For gi ...
- 21:开发脚本管理服务端LVS案例
[root@lb03 scripts]# cat lv_manager.sh #!/bin/bash #定义只能是root用户执行 ];then echo "permission deny ...
- Java基础08 继承(转载)
继承(inheritance)是面向对象的重要概念.继承是除组合(composition)之外,提高代码重复可用性(reusibility)的另一种重要方式.组合是重复调用对象的功能接口.继承可以重复 ...
- 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单
jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...
- 浅谈IM软件怎样建立安全socket连接、登录
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- python升级后pip 不可用 卸载pip
python版本由2.6升级到2.7之后,用pip提示报错 找了一下原因,网上的版本很多.弄来弄去比较麻烦 来点简单粗暴的 1.卸载pip yum remove python-pip 2.下载 cur ...
- C++中计算矩阵的行列式
使用eigen库: 求行列式: #include <iostream> #include <Eigen/Dense> using namespace std; using na ...
- PHP设置时区的方法
第一种方法:修改php.ini文件 即:date.timezone = '修改的时区名称' 对全局有效 第二种方法:date_default_timezone_set()动态设置时区,只是当前 ...
- Apache的下载以及安装
前言:生活,生下来,活下去 第一步:在浏览器的搜索栏输入:apache下载:显示如下,单机进入Apache的官网