Shell工具:jsondiff.sh
逻辑很简单,无非就是通过curl在不同的服务器上取得结果集,然后diff即可,不过这里有几点需要注意的地方:首先,JSON就一行,直接 diff会失去意义;其次,JSON中汉字会被编码,不利于查看;另外,JSON中字段顺序是无所谓的,所以diff前最好排序。说明一下,在格式化 JSON数据的时候,我没有用Bash,而是用的PHP:
- #!/bin/bash
- RM=/bin/rm
- PHP=/usr/bin/php
- CURL=/usr/bin/curl
- DIFF=/usr/bin/diff
- VIMDIFF=/usr/bin/vimdiff
- COLORDIFF=/usr/bin/colordiff
- usage() {
- echo "Usage: $0 --uri=<URI> --old=<IP> --new=<IP>"
- }
- format() {
- $PHP -R '
- function ksort_recursive(&$array) {
- if (!is_array($array)) {
- return;
- }
- ksort($array);
- foreach (array_keys($array) as $key) {
- ksort_recursive($array[$key]);
- }
- }
- $options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE;
- $array = json_decode($argn, true);
- ksort_recursive($array);
- echo json_encode($array, $options);
- '
- }
- request() {
- $CURL -s -H "Host: $1" "http://$2$3"
- }
- eval set -- $(
- getopt -q -o "h" -l "host:,uri:,old:,new:,vim,help" -- "$@"
- )
- while true; do
- case "$1" in
- --host) HOST=$2; shift 2;;
- --uri) URI=$2; shift 2;;
- --old) OLD=$2; shift 2;;
- --new) NEW=$2; shift 2;;
- --vim) VIM="Y"; shift 1;;
- -h|--help) usage; exit 0;;
- --) break;;
- esac
- done
- if [[ -z "$URI" || -z "$OLD" || -z "$NEW" ]]; then
- usage
- exit 1
- fi
- if [[ -z "$HOST" ]]; then
- HOST="www.foobar.com"
- fi
- OLD_FILE=$(mktemp)
- NEW_FILE=$(mktemp)
- request "$HOST" "$OLD" "$URI" | format > $OLD_FILE
- request "$HOST" "$NEW" "$URI" | format > $NEW_FILE
- if [[ "$VIM" == "Y" ]]; then
- $VIMDIFF $OLD_FILE $NEW_FILE
- elif [[ -x "$COLORDIFF" ]]; then
- $COLORDIFF -u $OLD_FILE $NEW_FILE
- else
- $DIFF -u $OLD_FILE $NEW_FILE
- fi
- $RM -f $OLD_FILE
- $RM -f $NEW_FILE
其中「getopt」的用法值得注意一下,相关参考资料如下:
- Getopt in Bash
- Bash: Preserving Whitespace Using set and eval
虽然我的Shell水平有限,但是我尽可能写得易用:在diff的时候,允许使用多种工具,缺省情况下会优先使用「colordiff」,需要的话还可以激活「vimdiff」。
Shell工具:jsondiff.sh的更多相关文章
- linux shell工具集合
1)判断进程是否存在,如果不存在再执行启动命令,可以避免一个脚本同时启动多份 if [ $(ps -ef |grep bastion_account.sh|grep -v grep|wc -l) - ...
- Shell工具| 流程控制
1. 流程控制 if 判断 ()[ 条件判断式 ],中括号和条件判断式之间必须有空格 ()if后要有空格 [kris@hadoop datas]$ vim if.sh #!/bin/bash -eq ...
- 二、hbase shell工具
hbase单节点安装请参考: https://www.cnblogs.com/lay2017/p/9944387.html 下文演示hbase shell工具常用的命令,首先启动hbase以及进入sh ...
- VPS性能测试shell工具以及锐速安装
比较熟悉的UnixBench非常耗费资源,需要长时间跑满cpu和IO,很多主机商都深恶痛绝,会做各种限制,其实也代表不了实际使用的业务效果,毕竟真正需要那么多cpu和IO的应用并不多.而网络状况却是大 ...
- Shell 脚本(五) Shell 工具 及 企业面试题
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 十.Shell工具(重点) 1.cut cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. ...
- 两个有用的shell工具总结
shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...
- 一款值得推荐的shell工具
1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...
- 基于.htaccess的Web Shell工具htshells
基于.htaccess的Web Shell工具htshells .htaccess文件是Apache服务器的配置文件.它负责相关目录下的网页配置.一旦用户获得修改该文件的权限,就可以基于该文件构建 ...
- ipython是python的交互式shell工具
ipython: 是python的交互式shell工具,比默认的python shell工具要好用.支持变了自动补全,自动缩进,内置了很多的功能和函数 启动:可以通过cmd来启动该工具 自动补全: I ...
- Linux 一款免费的shell工具 MobaXterm_Personal
一款免费的shell工具 MobaXterm_Personal
随机推荐
- linux下的shell和脚本
1.各种Unix shell linux下的shell基本是从unix环境中的shell发展而来,贴一下wiki:其中我们常用的,可归类为Bourne Shell(/usr/bin/sh或/bin/s ...
- VS2013中C++创建DLL导出class类
1.创建"Win32 Console Application"项目,命名为"ClassDllLib",并在"Application type" ...
- 面试题30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...
- 轻量级开源嵌入式关系数据库sqlite基本使用及接口初识
preface,先闲来扯下蛋: 嵌入式数据库,NoSQL的是BerkeleyDB和InnoDB,leveDb.TC(个人较不熟悉),关系型嵌入式是SQLite; 服务器性质的NoSQL服务器,如Red ...
- Ext.window的close的问题
以前每次都是用的hide,关闭后隐藏窗体,下一次点击再打开,这种方法在我的随笔里面有,可是现在遇到一个问题,我的窗体里面有个formpanel,formpanel每一项都有一个默认值,意思就是修改的时 ...
- 关于Spring中的PagedListHolder分页类的分析
PagedListHolder 这个类可以 对分页操作进行封装 文件在:import org.springframework.beans.support.PagedListHolder;下 默认是把查 ...
- ASP.NET简单文件上传
一>使用FileUpload控件,将其拖入页面: <%@ Page Title="hehe" Language="C#" MasterPageFil ...
- 基于Cordova5.0开发自己定义插件(android)
1.开发插件java部分 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhmMjE2MjE2/font/5a6L5L2T/fontsize/400/fi ...
- Android静态变量使用陷阱
静态变量大家再熟悉不过了,本来没什么好重复的.事情起因是这样的,最近测试那边反应正在做的一个产品总是莫名其妙的显示不出某些数据,甚至闪退崩溃,仔细查了几遍发现没什么问题,最后百般周折发现在那部测试机上 ...
- [RxJS] Changing Behavior with MapTo
You often need streams to trigger different behaviors on the data based on which streams triggers. T ...