一、任务描述

这回要做这么件事儿:

  1. 自动化修改文件名
  2. 自动化修改配置文件
  3. 自动化生成cluster_files并拼接
  4. 自动化生成query_time.dat
  5. 自动化画图

下面对每一步分别说明。

二、任务实现

1、自动化修改文件名
要修改生成不同时段的cluster_file的文件夹名称,如下图所示,时段区间都在文件夹名称上表示着

图1 文件夹换名

于是,编写脚本如下:

#!/bin/bash

old_sta=100
old_first_end=119
new_sta=200
new_first_end=219for k in $(seq 0 4)dolet cur_old_sta=${old_sta}+k*20let cur_old_end=${old_first_end}+k*20let cur_new_sta=${new_sta}+k*20let cur_new_end=${new_first_end}+k*20old_folder="src-${cur_old_sta}-${cur_old_end}"new_folder="src-${cur_new_sta}-${cur_new_end}"cd "/home/xuying/java_codes/localHBUpdating/"mv ${old_folder} ${new_folder}doneecho "Step 1 -- Modify Folders' names -- finished SUCESSFULLY!"

行1:#!/bin/bash 是编写脚本文件的必加头儿 行8:seq a b 用来生成从a到b的所有整数 行10~13:用 let 做数值计算时,运算量与运算符之间千万别有空格 行15~16:字符串的拼接方式 若该脚本文件名为1_mod_folder_name,则可通过以下两条命令让其执行。chmod +x 是将文件属性变成可执行的: > root@bmc~: chmod +x 1_mod_folder_name > root@bmc~: ./1_mod_folder_name 2、自动化修改配置文件 修改完文件夹名称后,分别进入这些文件夹,修改配置文件。由于这些文件夹的内容仅在于配置文件的参数值不同,故可统一修改:

图2 修改配置文件

脚本如下:

#!/bin/bash

old_sta=100
old_first_end=119
new_sta=200
new_first_end=219for k in $(seq 0 4)dolet cur_old_sta=${old_sta}+k*20let cur_old_end=${old_first_end}+k*20let cur_sta=${new_sta}+k*20let cur_end=${new_first_end}+k*20src_folder="src-${cur_sta}-${cur_end}"file_loc="/home/xuying/java_codes/localHBUpdating/${src_folder}/utility"echo ${file_loc}cd ${file_loc}sed -i "s/${cur_old_sta}/${cur_sta}/g" Configuration.javased -i "s/${cur_old_end}/${cur_end}/g" Configuration.javadoneecho "Step 2 -- Modify Config in CltFileGen -- finished SUCESSFULLY!"

其中,sed 命令用来替换文件中的字符串,“/g”选项表示将找到的字符串**全部替换**。 同样,若该脚本文件名为2_mod_cltgen_config,这样可执行: > root@bmc~: chmod +x 2_mod_cltgen_config > root@bmc~: ./2_mod_cltgen_config 3、自动化生成 cluster_files 并拼接 上述5个文件夹的代码,分别令其自动化 run 起来,生成不同时段的 cluster_files 后,拼接成一个最终文件:

图3 生成文件并拼接

脚本如下:

#!/bin/bash

new_sta=200
new_firt_end=219let joint_sta=${new_sta}
let joint_end=${new_first_end}+80joint_file_name="cluster_file_${joint_sta}-${joint_end}.txt"
echo ${joint_file_name}for k in $(seq 1 4)dolet lastk=k-1let sta_1=${new_sta}+${lastk}*20let end_1=${new_firt_end}+${lastk}*20let sta_2=${new_sta}+k*20let end_2=${new_firt_end}+k*20file_name_1="cluster_file_${sta_1}-${end_1}.txt"file_name_2="cluster_file_${sta_2}-${end_2}.txt"last_joint_name="${lastk}.txt"tmp_joint_name="${k}.txt"file_loc="/home/xuying/java_codes/localHBUpdating"cd ${file_loc}if [[ ${k} == "1" ]] ; thencat ${file_name_1} ${file_name_2} > ${tmp_joint_name}elsecat ${last_joint_name} ${file_name_2} > ${tmp_joint_name}rm ${last_joint_name}fiif [[ ${k} == "4" ]] ; thendst_loc="/home/xuying/java_codes/GCMP-Query/data"cp ${tmp_joint_name} "${dst_loc}/${joint_file_name}"fidoneecho "Step 3 -- Generate Cluster Files and Joint Them -- finished SUCESSFULLY!"

注意,在使用 if 语句时,条件可以用“[]”或“()”表示,但是一定要注意空格。感谢http://superuser.com/questions/688882/how-to-test-if-a-variable-is-equal-to-a-number-in-shell,让我终于折腾对了 if 的用法…… 同样,若该脚本文件名为3_gen_cluter_files,这样可执行: > root@bmc~: chmod +x 3_gen_cluter_files > root@bmc~: ./3_gen_cluter_files 4、自动化运行GCMP-Query 将刚才拼接好的 cluster_file_xxx.txt 作为输入,运行 GCMP-Query 程序,得到 query_time.dat 文件:

图4 GCMP Query

脚本如下:

#!/bin/bash

old_end=99
old_length=100
new_end=199
new_length=200file_loc="/home/xuying/java_codes/GCMP-Query/src/util"
cd ${file_loc}sed -i "s/${old_end}/${new_end}/g" Configuration.java
sed -i "s/${old_length}/${new_length}/g" Configuration.javarun_loc="/home/xuying/java_codes/GCMP-Query/src"
cd ${run_loc}javac main/Demo.java
echo "Compile successfully!"
java main.Demo

同样,若该脚本文件名为4_run_gcmp_query,这样可执行: > root@bmc~: chmod +x 4_run_gcmp_query > root@bmc~: ./4_run_gcmp_query 5、自动画结果图 生成 query-time.dat 后,执行 draw.plt (已为执行文件),生成最终的结果文件 result.pdf:

图5 画图

脚本如下:

#!/bin/bash

old_length=100
new_length=200draw_loc="/home/xuying/java_codes/GCMP-Query/gnuplot_draw"
cd ${draw_loc}sed -i "s/${old_length}/${new_length}/g" draw.plt./draw.pltecho "Step 4 -- Plot the results -- finished SUCCESSFULLY!"

同样,若该脚本文件名为5_plot_result,这样可执行: > root@bmc~: chmod +x 5_plot_result > root@bmc~: ./5_plot_result 注意,因为我用的是 gnuplot 这个软件来画图,当然,看官们可以选择其他的画图软件如Python。能使用 gnuplot 的前提是系统已经安装了该软件,gnuplot 的查看是否安装以及安装教程请移步万能Google。下面给出我的.dat 和 .plt 两个文件的内容: query_time.dat:

88.400000   193.600000  174.700000  177.600000  180.900000
285.000000  170.100000  168.200000  181.700000  168.800000
293.100000  179.500000  177.800000  178.500000  178.600000
619.200000  176.600000  174.200000  173.700000  175.700000

是的,这种形式的非常方便 .plt 文件画图,当然,需要在 GCMP-Query 中写出直接生成该 .dat 文件的代码。 当然,为了扩展方便,建议将每一列数据写到一个单独的 .dat 中,因为一列数据是一个变量在不同设置下的实验结果,日后若有算法对比,应该给该变量画单独的图。 draw.plt 的代码如下,为了偷懒,我将五个图画在了一张画布上:

#!/usr/bin/gnuplot
reset
set terminal pdfcairo lw 2 font "Helvetica, 18" size 12, 8
set  output "query_time.pdf"set multiplot###################################################              (1--r)set origin 0.18, 0.0
set size 0.33, 0.45
set tmargin 1set xlabel font  "Arial,20"
set ylabel font  "Arial,20"
set ylabel "Query Cost(ms)"
set xlabel "Time Length"
set title "Query_time vs. Time_Length"set key box on inside left top
#vertical Left enhanced samplen 3 spacing 0.8 width -0.5 height 0 box lw 1 width 2set xrange [0:3]
set xtics ("10" 0, "20" 1, "30" 2, "40" 3)unset labelplot "time_len.dat" using ($1) title 't_len' with linespoints lt 1 pt 1 lw 1 lc 1###################################################set origin 0.52, 0.0
set size 0.33, 0.45
set tmargin 1set xlabel font  "Arial,20"
set ylabel font  "Arial,20"
set ylabel "Query Cost(ms)"
set xlabel "K"
set title "Query_time vs. K"
unset keyset key box on inside left top
#vertical Left enhanced samplen 3 spacing 0.8 width -0.5 height 0 box lw 1 width 2set xrange [0:3]
set xtics ("1" 0, "3" 1, "6" 2, "9" 3)
set ytics 700
#set yrange [0:4]
#set ytics ("0" 0, "50" 1, "100" 2, "150" 3, "200" 4)#unset labelplot "K.dat" using ($1) title 'K' with linespoints lt 1 pt 2 lw 1 lc 2###################################################reset
set origin 0.0, 0.55
set size 0.33, 0.45
set tmargin 1set xlabel font  "Arial,20"
set ylabel font  "Arial,20"
set ylabel "Query Cost(ms)"
set xlabel "L"
set title "Query_time vs. L"set key box on inside left top
#vertical Left enhanced samplen 3 spacing 0.8 width -0.5 height 0 box lw 1 width 2set xrange [0:3]
set xtics ("1" 0, "2" 1, "3" 2, "4" 3)
set ytics 700
#set yrange [0:7]
#set ytics ("0" 0, "100" 1, "200" 2, "300" 3, "400" 4, "500" 5, "600" 6, "700" 7)unset labelplot 'L.dat' \using ($1) title 'L' with linespoints lt 1 pt 3 lw 1 lc 3###################################################reset
set origin 0.33, 0.55
set size 0.33, 0.45
set tmargin 1set xlabel font  "Arial,20"
set ylabel font  "Arial,20"
set ylabel "Query Cost(ms)"
set xlabel "G"
set title "Query_time vs. G"set key box on inside left top
#vertical Left enhanced samplen 3 spacing 0.8 width -0.5 height 0 box lw 1 width 2set xrange [0:3]
set xtics ("5" 0, "10" 1, "20" 2, "40" 3)
set ytics 700
#set yrange [0:7]
#set ytics ("0" 0, "100" 1, "200" 2, "300" 3, "400" 4, "500" 5, "600" 6, "700" 7)unset labelplot 'G.dat' \using ($1) title 'G' with linespoints lt 1 pt 4 lw 1 lc 4###################################################reset
set origin 0.66, 0.55
set size 0.33, 0.45
set tmargin 1set xlabel font  "Arial,20"
set ylabel font  "Arial,20"
set ylabel "Query Cost(ms)"
set xlabel "M"
set title "Query_time vs. M"set key box on inside left top
#vertical Left enhanced samplen 3 spacing 0.8 width -0.5 height 0 box lw 1 width 2set xrange [0:3]
set xtics ("500" 0, "1000" 1, "2000" 2, "4000" 3)
set ytics 700
#set yrange [0:7]
#set ytics ("0" 0, "100" 1, "200" 2, "300" 3, "400" 4, "500" 5, "600" 6, "700" 7)unset labelplot 'M.dat' \using ($1) title 'M' with linespoints lt 1 pt 5 lw 1 lc 5###################################################unset multiplot#

最后生成的结果图如下:

图6 实验结果图

6、统一起来
此处,还可以写个 0_bash_config 的脚本,将各个脚本文件中的预设参数值给统一替换:

#!/bin/bash

let old_sta_pre_value=0
let old_sta_nxt_value=${old_sta_pre_value}+100let new_sta_pre_value=100
let new_sta_nxt_value=${new_sta_pre_value}+100let old_first_end_pre_value=19
let old_first_end_nxt_value=${old_first_end_pre_value}+100let new_first_end_pre_value=119
let new_first_end_nxt_value=${new_first_end_pre_value}+100let old_end_pre_value=99
let old_end_nxt_value=${old_end_pre_value}+100let new_end_pre_value=199
let new_end_nxt_value=${new_end_pre_value}+100let old_length_pre_value=100
let old_length_nxt_value=${old_length_pre_value}+100let new_length_pre_value=200
let new_length_nxt_value=${new_length_pre_value}+100echo "new_length_nxt_value=${new_length_nxt_value}"pre_string_1="old_sta=${old_sta_pre_value}"
nxt_string_1="old_sta=${old_sta_nxt_value}"pre_string_2="new_sta=${new_sta_pre_value}"
nxt_string_2="new_sta=${new_sta_nxt_value}"pre_string_3="old_first_end=${old_first_end_pre_value}"
nxt_string_3="old_first_end=${old_first_end_nxt_value}"pre_string_4="new_first_end=${new_first_end_pre_value}"
nxt_string_4="new_first_end=${new_first_end_nxt_value}"pre_string_5="old_end=${old_end_pre_value}"
nxt_string_5="old_end=${old_end_nxt_value}"pre_string_6="new_end=${new_end_pre_value}"
nxt_string_6="new_end=${new_end_nxt_value}"pre_string_7="old_length=${old_length_pre_value}"
nxt_string_7="old_length=${old_length_nxt_value}"pre_string_8="new_length=${new_length_pre_value}"
nxt_string_8="new_length=${new_length_nxt_value}"bash_loc="/home/xuying/java_codes/bashes"sed -i "s/${pre_string_1}/${nxt_string_1}/g" ${bash_loc}/*
sed -i "s/${pre_string_2}/${nxt_string_2}/g" ${bash_loc}/*
sed -i "s/${pre_string_3}/${nxt_string_3}/g" ${bash_loc}/*
sed -i "s/${pre_string_4}/${nxt_string_4}/g" ${bash_loc}/*
sed -i "s/${pre_string_5}/${nxt_string_5}/g" ${bash_loc}/*
sed -i "s/${pre_string_6}/${nxt_string_6}/g" ${bash_loc}/*
sed -i "s/${pre_string_7}/${nxt_string_7}/g" ${bash_loc}/*
sed -i "s/${pre_string_8}/${nxt_string_8}/g" ${bash_loc}/*echo "Step 0 -- Config all bash files -- finished SUCESSFULLY!"

最后,还可以写一个 run_all 的脚本文件:

#!/bin/bash

./0_config
./1_mod_folder_name
./2_mod_cltgen_config
./3_gen_cluter_files
./4_run_gcmp_query
./5_plot_resultecho "** Congratulations!! all is Completed!!!  **"

好了,写到这儿,只要代码没错。那么,每次重新从 生成 cluster_files 到 生成最终结果图,只需要两步:
1) 修改 0_bash_config 中的参数值
2) 运行 run_all

root@bmc~: chmod +x run_all
root@bmc~: ./run_all

大家周一愉快:)

用shell bash自动化程序相关推荐

  1. shell脚本自动化部署服务

    shell脚本自动化部署 !/bin/bash#export PATH=$PATH:/export/maven/binrun_flag_dir="/data0/shell/deploy_wo ...

  2. 使用 Shell 脚本自动化 Linux 系统维护任务

    如果一个系统管理员花费大量的时间解决问题以及做重复的工作,你就应该怀疑他这么做是否正确.一个高效的系统管理员应该制定一个计划使得其尽量花费少的时间去做重复的工作.因此尽管看起来他没有做很多的工作,但那 ...

  3. 国内Linux shell,Bash shell 的诞生 | Linux 中国

    原标题:Bash shell 的诞生 | Linux 中国 本周的<代码英雄>播客深入研究了最广泛使用的.已经成为事实标准的脚本语言,它来自于自由软件基金会及其作者的早期灵感. -- Ma ...

  4. bash 运行程序 下一步_怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. -- David Both(作者) Shell 是操作系统的命令解释器,其中 Bash ...

  5. linux超级基础系列——什么是shell? bash和shell有什么关系

    什么是Shell?        shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核.    ...

  6. Shell(bash) 介绍

    文章目录 Shell 介绍 Shell 种类 命令行环境 终端模拟器 命令行提示符 进入和退出方法 Shell 脚本 第一个shell脚本 Bash Bash如何解析命令 Shell 和 Bash 的 ...

  7. bash 后台程序_如何向您的Bash程序添加帮助工具

    bash 后台程序 在本系列的第一篇文章中,您创建了一个很小的单行Bash脚本,并探讨了创建Shell脚本的原因,以及为什么它们是系统管理员而非编译程序最有效的选择. 在第二篇文章中 ,您开始了创建一 ...

  8. awk,gawk调用shell,bash中的变量 笔记221106

    awk,gawk调用shell,bash中的变量 笔记221106 "'${变量名}'" 双 包 单 包 ${} 包 变量名 "'"${变量名}"'& ...

  9. vbs 自动化程序!

    Dim WshShell, QQPath, QQselect QQPath="C:\Users\gj\Desktop\工具\qwe.exe" '这里是指定程序路径 Set WshS ...

  10. shell bash脚本_如何在Windows 10上创建和运行Bash Shell脚本

    shell bash脚本 With the arrival of Windows 10's Bash shell, you can now create and run Bash shell scri ...

最新文章

  1. 收银机打印数据截取_智能收银机助力社区零售,挖掘消费新潜力
  2. 怎样把开启的服务放到后台?
  3. Druid-目前最好的连接池
  4. 动态添加Table tbody 给option 下拉框动态赋值 逻辑删除
  5. java ajax异步验证,【求助】真的不会做了。。关于AJAX异步验证的问题。。
  6. 初学Web 前端感受
  7. 技术升级成为Linux运维人前途的魔障,是跟进还是选择被淘汰?
  8. Croe文件在线预览
  9. ibm 的java实现_IBM Java Toolbox for 实现IBM i 消息通信
  10. springboot证书管理系统的设计与实现毕业设计源码162317
  11. 从深海带回更多的东西 (汪品先)
  12. Android 12 双击power键启动相机源码解析
  13. c语言信封比大小,从C打印信封#
  14. 通过uid对b站用户等级进行划分脚本
  15. ShapeExplorer
  16. ros:编译navigation
  17. spring cloud gateway 与spring cloud版本对应问题
  18. Istio金丝雀发布
  19. redis下的cluste的脚本监控
  20. miniUI实现tab切换时显示隐藏菜单栏

热门文章

  1. matlab 矩阵位移法编程 结构力学,matlab-矩阵位移法编程-结构力学.doc
  2. 一个程序员的成长之路(持续更新)
  3. 同比 数据模型 环比_同比(环比)在分析模型中的实现
  4. app标签栏android,Android Navigation TabBar控件实现多彩标签栏
  5. 破解庞加莱猜想--中国人干的!
  6. 一看就停不下来的中国史
  7. 跳出都市 赏不一样的月光
  8. VMWare16上安装CentOS 7镜像
  9. DASCTF2022 7月赋能赛 crypto wp(DASCTF2022.07赋能赛Pwn easyheap)
  10. SpringBoot整合Mail