awk一个神奇而又强大的功能,绝对是一个开发利器,效率直选!希望这里的一些总结能帮到那些存在困惑的人!
awk实战1-基础语法说明
awk实战2-流程控制语句总结
awk实战3-awk数组技巧
awk实战4-函数系列-算数函数说明
awk实战5-函数系列-基本字符串函数
awk实战6-函数系列-字符串函数说明-asort和sub
awk实战7-函数系列-时间函数
awk实战8-函数系列-字节操作
awk实战9-IO函数-getline和close
awk实战10-IO函数-其他介绍
awk实战11-进阶-10种awk有效应用实战
awk实战12-进阶-再谈awk匹配模式
awk处理小问题-解决局部jar包替换
osgi框架的大型开源代码运行包,会包含很多bundle,这些包通过maven编译后会产生大量jar,并通过安装打包产生一个整包.
例如开源控制器opendaylight
但是程序内部联调纠错时候往往不需要编译整个工程产生一个运行包,这样花费额外的时间,编译局部模块替换jar包则是一个更加高效的选择;
但是传统替换jar包方式是一个纯手工劳动,需要在.m2仓库找到相关包,并人工拷贝到新的运行包位置,这个过程随机也目录层次结构深,需要花费额外的时间,本文就是想在maven局部模块编译中,通过编译信息识别修改jar,通过一键操作,自动完成jar替换
;
将大型工程maven编译产生的多个成功的jar包提取出来,分别替换到指定子集目录,完成编译后更新jar动作;
需求分解:
如下所示为本次功能实现的shell代码案例:
其中jar_path
代表控制器的运行版本路径;odl_path
为本地m2仓库位置;m2_build
为一个文件名,存放maven编译打印信息–通常只用复制一组bundle编译过程中最后的编译结果打印即可
#!/usr/bin/env bash
odl_path=/home/user/.m2/repository/
jar_path=./opendaylight/system/
##### 1-检查参数
[ ! -f m2_build ] && echo "please input your last build message to m2_build file!" && exit -1
##### 2-读取maven输入结构,识别需要处理jar包,生成搜索正则表达式
path_regex=`cat m2_build | awk '/SUCCESS \[/{gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}'`
#tocp_path=`echo $path_regex | xargs -d " " -I {} find $jar_path -type f -regex {} -printf "%s\n"`
##### 3-根据正则表达式搜索并替换jar包
echo $path_regex | xargs -d " " -I {
} find $odl_path -type f -mtime -1 -regex {
} -print \
| awk -v m2path=$odl_path -v tocp=$jar_path '{jarfile=$1;gsub(m2path,"",$1);print $1}' \
| xargs -t -I {
} cp -fr $odl_path{
} $jar_path{
}
##### 4-检查运行位置jar包是否正常替换
echo $path_regex | xargs -d " " -I {
} find $jar_path -type f -mtime -1 -regex {
} -print | xargs -I{
} ls -l {
}
如下所示主要目的是为了检查命令行入参是否携带相关maven编译打印文件;
[ ! -f m2_build ] && echo "please input your last build message to m2_build file!" && exit -1
path_regex=`cat m2_build | awk '/SUCCESS \[/{gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}'`
这里有如下要点需要提醒:
使用``号(不是单引号),运行一段命令,并将最终打印结果传给path_regex;
/SUCCESS \[/
这里是一个正则表达式匹配,主要为了匹配编译过程中的成功信息行;
{gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}
使用gsub替换掉了匹配行第二列的字符串中所有的.变成斜杠,相当于将包名替换成了一段路径,并将处理内容前后加入’.*'以及版本号,生成了一个用于find检索的正则表达式;
echo $path_regex | xargs -d " " -I {
} find $odl_path -type f -mtime -1 -regex {
} -print \
| awk -v m2path=$odl_path -v tocp=$jar_path '{jarfile=$1;gsub(m2path,"",$1);print $1}' \
| xargs -t -I {
} cp -fr $odl_path{
} $jar_path{
}
这里有如下要点:
最近一天内修改
/类型为文件
/符合上文正则表达式的包
进行打印;基本所有原理同3.3,使用ls -l查看就可以指导是否正常替换了jar包;
echo $path_regex | xargs -d " " -I {
} find $jar_path -type f -mtime -1 -regex {
} -print | xargs -I{
} ls -l {
}
本文实战脚本主要使用awk完成一些字符串模式识别和替换,这里主要包括:
在find的使用中一开始是没有加入-type f -mtime -1
,而maven仓库以及karaf运行包目录一般又很大,整个过程非常的缓慢,在加入这两个选项后,则极大提高了检索效率–因为事实上该脚本运行的前提也是一些jar包在完成编译后,立即替换,达到仅编译一个或者几个模块,就能生成新的运行包的目的.
当然脚本也存在一些不足:
1-必须将maven编译信息复制到一个文件进行处理;
2-相对路径提取似乎值得优化,特别是如果jar_path
和odl_path
为相对路径会存在一些使用问题!