逻辑很简单,无非就是通过curl在不同的服务器上取得结果集,然后diff即可,不过这里有几点需要注意的地方:首先,JSON就一行,直接 diff会失去意义;其次,JSON中汉字会被编码,不利于查看;另外,JSON中字段顺序是无所谓的,所以diff前最好排序。说明一下,在格式化 JSON数据的时候,我没有用Bash,而是用的PHP:

  1. #!/bin/bash
  2. RM=/bin/rm
  3. PHP=/usr/bin/php
  4. CURL=/usr/bin/curl
  5. DIFF=/usr/bin/diff
  6. VIMDIFF=/usr/bin/vimdiff
  7. COLORDIFF=/usr/bin/colordiff
  8. usage() {
  9. echo "Usage: $0 --uri=<URI> --old=<IP> --new=<IP>"
  10. }
  11. format() {
  12. $PHP -R '
  13. function ksort_recursive(&$array) {
  14. if (!is_array($array)) {
  15. return;
  16. }
  17. ksort($array);
  18. foreach (array_keys($array) as $key) {
  19. ksort_recursive($array[$key]);
  20. }
  21. }
  22. $options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE;
  23. $array = json_decode($argn, true);
  24. ksort_recursive($array);
  25. echo json_encode($array, $options);
  26. '
  27. }
  28. request() {
  29. $CURL -s -H "Host: $1" "http://$2$3"
  30. }
  31. eval set -- $(
  32. getopt -q -o "h" -l "host:,uri:,old:,new:,vim,help" -- "$@"
  33. )
  34. while true; do
  35. case "$1" in
  36. --host)    HOST=$2; shift 2;;
  37. --uri)     URI=$2;  shift 2;;
  38. --old)     OLD=$2;  shift 2;;
  39. --new)     NEW=$2;  shift 2;;
  40. --vim)     VIM="Y"; shift 1;;
  41. -h|--help) usage;   exit 0;;
  42. --)                 break;;
  43. esac
  44. done
  45. if [[ -z "$URI" || -z "$OLD" || -z "$NEW" ]]; then
  46. usage
  47. exit 1
  48. fi
  49. if [[ -z "$HOST" ]]; then
  50. HOST="www.foobar.com"
  51. fi
  52. OLD_FILE=$(mktemp)
  53. NEW_FILE=$(mktemp)
  54. request "$HOST" "$OLD" "$URI" | format > $OLD_FILE
  55. request "$HOST" "$NEW" "$URI" | format > $NEW_FILE
  56. if [[ "$VIM" == "Y" ]]; then
  57. $VIMDIFF $OLD_FILE $NEW_FILE
  58. elif [[ -x "$COLORDIFF" ]]; then
  59. $COLORDIFF -u $OLD_FILE $NEW_FILE
  60. else
  61. $DIFF -u $OLD_FILE $NEW_FILE
  62. fi
  63. $RM -f $OLD_FILE
  64. $RM -f $NEW_FILE

其中「getopt」的用法值得注意一下,相关参考资料如下:

  1. Getopt in Bash
  2. Bash: Preserving Whitespace Using set and eval

虽然我的Shell水平有限,但是我尽可能写得易用:在diff的时候,允许使用多种工具,缺省情况下会优先使用「colordiff」,需要的话还可以激活「vimdiff」。

Shell工具:jsondiff.sh的更多相关文章

  1. linux shell工具集合

    1)判断进程是否存在,如果不存在再执行启动命令,可以避免一个脚本同时启动多份 if [ $(ps -ef |grep  bastion_account.sh|grep -v grep|wc -l) - ...

  2. Shell工具| 流程控制

    1. 流程控制 if 判断 ()[ 条件判断式 ],中括号和条件判断式之间必须有空格 ()if后要有空格 [kris@hadoop datas]$ vim if.sh #!/bin/bash -eq ...

  3. 二、hbase shell工具

    hbase单节点安装请参考: https://www.cnblogs.com/lay2017/p/9944387.html 下文演示hbase shell工具常用的命令,首先启动hbase以及进入sh ...

  4. VPS性能测试shell工具以及锐速安装

    比较熟悉的UnixBench非常耗费资源,需要长时间跑满cpu和IO,很多主机商都深恶痛绝,会做各种限制,其实也代表不了实际使用的业务效果,毕竟真正需要那么多cpu和IO的应用并不多.而网络状况却是大 ...

  5. Shell 脚本(五) Shell 工具 及 企业面试题

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 十.Shell工具(重点) 1.cut cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. ...

  6. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  7. 一款值得推荐的shell工具

    1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...

  8. 基于.htaccess的Web Shell工具htshells

    基于.htaccess的Web Shell工具htshells   .htaccess文件是Apache服务器的配置文件.它负责相关目录下的网页配置.一旦用户获得修改该文件的权限,就可以基于该文件构建 ...

  9. ipython是python的交互式shell工具

    ipython: 是python的交互式shell工具,比默认的python shell工具要好用.支持变了自动补全,自动缩进,内置了很多的功能和函数 启动:可以通过cmd来启动该工具 自动补全: I ...

  10. Linux 一款免费的shell工具 MobaXterm_Personal

    一款免费的shell工具 MobaXterm_Personal

随机推荐

  1. BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛

    1635: [Usaco2007 Jan]Tallest Cow 最高的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 346  Solved: 184 ...

  2. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  3. 深入理解linux网络技术内幕读书笔记(四)--通知链

    Table of Contents 1 概述 2 定义链 3 链注册 4 链上的通知事件 5 网络子系统的通知链 5.1 包裹函数 5.2 范例 6 测试实例 概述 [注意] 通知链只在内核子系统之间 ...

  4. Sonar入门(五):使用 Sonar 进行代码质量管理

    Sonar 概述 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具. 与持续集成工具(例如 Hudson/Jenkins ...

  5. FLEX中Tree默认展开全部节点

    这里分两种情况,一种是数据源在MXML文件里,如: <mx:XML id="treeXML" format="e4x"> <root> ...

  6. openMP的一点使用经验

    最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程可 ...

  7. stat(),lstat(),fstat() 获取文件/目录的相关信息

    stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat ...

  8. Linux重装系统后SSH登录失败

    #Linux重装系统后SHH登录服务器报错 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE H ...

  9. windows下删除服务的方法

    删除的办法有两个: 办法一: 用sc.exe这个Windows命令 开始——运行——cmd.exe,然后输入sc就可以看到了.使用办法很简单: sc delete "服务名" (如 ...

  10. [转]CSS目标伪类E:target

    CSS3 target 伪类不得不说那些事儿(纯CSS实现tab切换) 是不是觉得target有点眼熟?! 今天要讲的不是HTML的<a>标签里面有个target属性. target伪类是 ...