- 浏览: 208634 次
- 性别:
- 来自: 杭州
最新评论
-
李嘉图0624:
第一段代码就出错了,少了g.close();不关闭的话,也没有 ...
Jackson 入门 -
daichangfu:
不光是生僻字需要,正常的也需要啊。
解决Java应用在Linux下无法正常水印生僻字 -
yaoweinan:
不错
JGroup配置笔记 -
learnworld:
grandboy 写道我想json的数据多一些对于数据绑定回j ...
Jackson 入门 -
grandboy:
我想json的数据多一些对于数据绑定回javabean时不会出 ...
Jackson 入门
先让大家看一个脚本:
#!/bin/sh
start_time=${1:-19:00} amount=${2:-1000} total_runtime=${3:-1} runinterval=${4:-1}
BASE="/home/wolf/ezra/deploy/target/bundle-ear" LOCAL_CLASSPATH=`echo $BASE/*.jar | tr ' ' ':'` CLASSPATH="/usr/repos/repository.external/java/j2ee/j2ee-1.4.jar:$LOCAL_CLASSPATH"
if [ -n "`ps -ef | grep java |grep task`" ];then echo "task has been run before, refuse to run another task instance." >> /home/wolf/output/daemon/usr/task.log exit -1; fi
java -DtaskName=task -cp $CLASSPATH -Dapplication.codeset=GBK -Ddatabase.codeset=ISO-8859-1 -Xms64m -Xmx1024m -server com.daemon.offer.Task $start_time $amount $total_runtime $runinterval &
|
看到什么问题没?脚本是没有问题的,对吧。只是如果摆放程序的位置发生变化,至少有几个地方是需要修改的。这包括程序所在目录,第三方类库的目录以及日志文件目录的信息。
那么是不是就留着让它继续这样下去吗?当然是可以的,只要你能忍受无休止的重复劳动,而本来你可以用做这些无聊的事情时间去做更多有意义的事情!
假设我们有个项目属性文件可以提供这些信息,那么我们现在要做的事情就是想办法从这个属性文件里面将这些配置读取出来。读取配置是容易的,因为配置里面都是一些键值对。这个用grep或者sed以或者用awk都能比较简单方便的取出来。可是这里有个难题,怎么解决属性值嵌套问题呢?例如下面的代码:
deployhome = ${homepath}/deploy homepath = /usr/ ${project}/416 project=anthrex |
好了,先解决第一个问题,看看以下段代码:
function getValue() { echo "`sed -e 's/^#.*//' < $2| sed -n 's/.*'$1'[\ ]*=[\ ]*//p'`" }
JAVA_HOME="`getValue javahome $properties`"; SECOND_REPOSITORY="`getValue project $properties`" THIRD_REPOSITORY="`getValue external $properties`" HOME_PATH="`getValue homepath $properties`"; OUTPUT="`getValue output $properties`" |
bash shell里面是允许有函数的,与Java的函数不同之处就是,方法参数是不需要声明的。上面这段脚本里面,核心是getValue函数,不用声明函数参数,调用时直接指定就可以的。这个函数很简单,利用sed对输入的每行字符做了两个替换动作。
sed -e 's/^#.*//' |
命令中字符s告诉sed要进行替换操作。/是分隔符,第一个分隔符后面指定了^#.*,要替换的行就是注释的行,第二和第三个是空字符。也就是先忽略掉注释的行。
sed -n 's/.*'$1'[\ ]*=[\ ]*//p' |
这个与第一个sed命令不同是-e变成了-n,就是默认不打印所匹配的模式使用了这个参数,在整个命令的后面通常都会跟p打印指令。-e是运行脚本。这个命令是要将匹配的键值找出来,并且把空格去掉。如果$1是java.home,那么这个命令就可能找到java.home = /usr/java这一行,最后得到/usr/java。
好了,通过上述改造,脚本只需要输入项目Properties文件文件就可以了,其他参数自动生成。
这个问题是完全结束了,可是要是属性值里引用了其他键值,例如
upload.temp = ${output}/temp |
,这个脚本就没辙了。要是也能做到像Spring里面的PropertiesConfigure实现那样该多好啊!
显然,要简单的想用shell或者sed来实现这个功能已经不容易了,起码会很费劲。这里我想起了awk里面的Associative Array,关联数组,说白了这个与Java里面的Map非常类似。利用这特点就可以将属性值里面的引用扩展了。
cat $1 | sed -e 's/^#.*//g' -e 's/[ ]*//g' | gawk -f ./expan.sh > properties properties=./properties
function getValue() { sed -n 's/.*'$1'[\ ]*=[\ ]*//p' < $2; }
JAVA_HOME="`getValue javahome $properties`"; SECOND_REPOSITORY="`getValue project $properties`" THIRD_REPOSITORY="`getValue external $properties`" HOME_PATH="`getValue homepath $properties`"; OUTPUT="`getValue output $properties`" |
这个脚本与之前的脚本最大的不同在于引入了awk,先把注释行替换才丢给awk处理。再来看看这个expan.sh
#!/bin/gawk -f #written by Ginge BEGIN{ FS="="; } { if(NF ==2) { map[$1]=$2; } } END { expan(map);
for(i in map){ print i"="map[i]; } }
function expan(map){ for (i in map) { val=map[i]; left=index(map[i], "{"); right=index(map[i],"}"); subkey=""; if(left > 0 && right > 0){ subkey=substr(map[i],left+1,right-left-1); if(length(map[subkey]) > 1){ val=map[subkey]""substr(map[i],right+1,length(map[i])); map[i]=val; if(index(map[i],"{") > 0) expan(map); } } } } |
看上去还是很简单的吧,第一行声明了这是一个gawk(用gawk是为了要使用它的用户自定义function特性)脚本。
Awk默认以空格来分离每行的输入,上述脚本在BEGIN代码块指明了用=来分离。这样
javahome=/user/Java/jdk1.5.0_17 |
这行输入就被分成了javahome和/user/Java/jdk1.5.0_17,用位置参数可以访问到这些分离之后的值。例如$1的值是javahome,$2是/user/Java/jdk1.5.0_17,以此类推。
BEGIN和END代码块是可选的,这些代码只调用一次,中间中括号之间的map[$1]=$2就是关联数组了;它对每个输入都是执行一次的。结合BEGIN和中间的代码块,我们就做到了map[javahome]= /user/Java/jdk1.5.0_17这样的效果。如何扩展属性看看那个附件的expan函数就知道了。
到这里改造完成了。
deployhome = ${homepath}/deploy homepath = /usr/ ${project}/416 project=anthrex |
通过脚本改造后可以得到这样的结果
deployhome= /usr/ anthrex /416/deploy homepath= /usr/ anthrax/416 project=anthrex |
到此我们实战了sed的简单用法和awk的高级功能关联数组,看来shell脚本还是比较好玩的。
- PropertiesParser.zip (938 Bytes)
- 下载次数: 25
发表评论
-
开发新手通用代码问题
2011-06-04 06:32 13170最近辅导黄埔的同学进行开发,发现了一些问题,隐约看到当年自己写 ... -
jmockit 的使用系列
2010-12-13 21:30 94171. 入门 2. 完整的Mock步骤 ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 21:11 4876package jmockit.sample; impo ... -
jmockit 的使用示例-03全部mock的?
2010-12-13 21:11 3644package jmockit.sample; impo ... -
jmockit 的使用示例-04静态部分mock示例
2010-12-13 21:10 3862package jmockit.sample; impo ... -
jmockit 的使用示例-06私有成员的Mock
2010-12-13 21:10 7652目标测试代码 package jm ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 21:09 4690目标测试代码 package jmockit.target ... -
jmockit 的使用示例-09构造方法也可以Mock?基于状态的Mock?
2010-12-13 21:07 10376目标测试代码 package jmockit.target ... -
jmockit 的使用示例-10另一种基于状态的Mock,随穿随脱?
2010-12-13 21:07 2705目标测试代码 package jm ... -
jmockit 的使用示例-11不是吧,还能访问实际被Mock的对象?
2010-12-13 21:07 3231目标测试代码 package jmockit.target ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 20:40 5889目标测试代码 package jmockit.target ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 20:31 1462package jmockit.sample; impo ... -
开放的心态
2010-10-02 13:56 982今天看李笑来的《把时间当作朋友》,看到一句话,“我们的大脑 ... -
Jackson 入门
2010-09-15 07:17 6492同事的一些测试结果看来,Jackson在处理Json方面性能相 ... -
解决Java应用在Linux下无法正常水印生僻字
2010-04-10 13:46 5616昨天接到一个投诉,说是他的水印是一个方框。刚开始还以为是程序出 ... -
同学们,秒投简历啦!
2010-03-12 23:51 221公司业务急速扩张,急需有才能的同学加入到我们的行列中, ... -
反编译工具
2009-12-31 20:54 1132追查JVM崩溃过程中使用到的反编译工具,其中beanutils ... -
追查JVM崩溃
2009-12-31 20:25 2241JDK升级到1.6后,服务器集群经常崩溃,后来把VM的参 ... -
普通用户下实现Apache 2.2.14与jboss-5.1.0.GA集成
2009-11-29 23:05 2766Apache与jboss集成,实际是apache与tomcat ... -
swt 笔记
2009-11-27 00:24 891http://www.ibm.com/developerwor ...
相关推荐
1 Linux主要shell命令详解 2 Linux bash shell脚本语法入门 3 Shell基本命令 4 使用 sed 编辑器
Shell脚本专家指南.pdf sed与awk第二版.pdf shell十三问.pdf
linux下常用脚本命令集合 : awk sed bash shell Shell范例精解(第4版)
sed与awk 编写脚本利器。
目录网盘文件永久链接 13Linux下Shell编程之While case...25Shell脚本编程综合实战一 26Shell脚本编程综合实战一 27Shell脚本综合实战二 28Shell脚本综合实战二 29Shell编程数组编程及复习 30Shell编程数组编程及复习
shell脚本修改json中某个字段的值 - 思路:通过awk来找到旧数据,然后用sed来替换旧数据
第16章 shell脚本介绍 151 第17章 条件测试 154 第18章 控制流结构 160 第19章 shell函数 202 第20章 向脚本传递参数 224 第21章 创建屏幕输出 236 第22章 创建屏幕输入 252 第23章 调试脚本 274 第24章 shell嵌入...
linux shell脚本学习 Bash+Sed+Awk(1).pdf
创建Shell脚本文件,编写如下过程:首先创建MAC地址的存储文件,然后使用arping命令,根据IP地址探测局域网中的主机获取对应的信息记录,应用grep命令、sed命令、awk命令对信息记录进行筛选,最后将筛选后的信息通过...
关于Sed以及Awk的使用文档,可以帮助提升脚本语言shell的使用。
shell脚本学习资料 包括了比较常用的sed awk等命令
shell sed awk作为shell编程的很好入门级文档,我开始学习的时候就是这个文档,现在遇到新手我就会推荐这个文档。
Sed and Awk 单行脚本快速处理字符或者文本
sed和awk具有相同的命令行语法,以脚本的形式接收用户的命令。因为所有这三个程序都使用unix正则表达式,因此书中用一章的篇幅来介绍unix的正则表达式语法。 然后,本书介绍如何编写sed脚本。从编写几行简单的脚本...
《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...
在企业工作中,每天做的Linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定字符串。...
文章目录前言一、什么是shellshell脚本大白话二、shell常用操作三、文本处理三剑客 — 搜索工具grep1.什么是grep2.格式3.主要参数4.pattern正则表达式主要参数:5. grep使用实例四、文本处理三剑客 — 流编辑器sed1....
获取单个文件行数 文件:test1.sh 行数:20 方法一 代码如下: ...sed -n ‘$=’ test1.sh 如图所示: 方法五 代码如下: wc -l test1.sh 如图所示: 方法六 代码如下: #cat test1.sh |wc -l 如图所
《Linux命令行与shell脚本编程大全案例》源码下载脚本参考基本命令行编写入门规范入门基础awk、sed、基本输入、控制语句;gawk进阶,mysql数据库,sed进阶,shell脚本编程进阶,初识sed和gawk,处理用户输入,基本...