menu

如何快速找出properties配置文件缺少的不同配置项

概述

在我们的开发(笔者为 Java 开发)过程中会接触到各种各样的配置文件(用 properties 文件举例),那么配置文件中的配置信息过多、有多个环境配置文件时,维护起来很不方便,甚至有时会漏掉一些配置信息导致多个环境的配置项缺失,这会造成不小的麻烦,本文就如何解决此类问题进行介绍。

内容

首先我们说明一下,使用到的工具均为 Linux 命令(最新版 Windows 10 系统可以通过 WSL 运行,详见文末),需要用到的命令也可以通过文末的参考资料进一步了解。

处理思路

我们知道,properties 文件是按照 key=value 的方式存储各个配置项,以 # 开头作为注释。根据这一特性,我们可以按照以下思路来解决本文的问题:

* 第一步:去除 # 开头的注释,我们只处理 key=value 这种配置项

* 第二步:按照 key=value 的特性,用等号“=”分割,只保留配置项(不同环境的 value 不一样,只保留 key 以便对比)

* 第三步:按照 key 排序,这样更方便的对比文件内容

* 第四步:去除重复的配置项(有时候开发同学会不小心一个配置写两份,这里我们需要去除以下重复的,便于比较)

* 第五步:使用 diff 命令进行文件内容比较

代码实现(shell)

#!/bin/bash
grep -v ^#     dev/jsf.properties | awk -F '=' '{print $1}' | sort | uniq >     'dev/jsf.properties_'
grep -v ^#  betaf1/jsf.properties | awk -F '=' '{print $1}' | sort | uniq >  'betaf1/jsf.properties_'
grep -v ^#  betaf2/jsf.properties | awk -F '=' '{print $1}' | sort | uniq >  'betaf2/jsf.properties_'
grep -v ^# product/jsf.properties | awk -F '=' '{print $1}' | sort | uniq > 'product/jsf.properties_'
echo 'diff dev/jsf.properties betaf1/jsf.properties' > diff.out
diff -B dev/jsf.properties_ betaf1/jsf.properties_ >> diff.out
echo 'diff dev/jsf.properties betaf2/jsf.properties' >> diff.out
diff -B dev/jsf.properties_ betaf2/jsf.properties_ >> diff.out
echo 'diff dev/jsf.properties product/jsf.properties'
diff -B dev/jsf.properties_ product/jsf.properties_ >> diff.out
cat diff.out
#clean
rm dev/jsf.properties_
rm betaf1/jsf.properties_
rm betaf2/jsf.properties_
rm product/jsf.properties_
rm diff.out
echo 'all clean'

也可以在 profiles 目录下直接使用一行命令运行:``` curl -s https://blog.xiaoi.me/assets/res/diff-properties.sh | bash ```

代码解释:

我们这里有 dev、betaf1、betaf2、product 四个环境的配置文件,因此我们以 dev 为基准分别进行比较之后合并比较结果。第一行的 ```grep -v ^# dev/jsf.properties``` 的作用为查找该文件不以 # 开头的内容(去除注释),这里的 -v 参数为取反,不带 -v 参数的话就是查找以 # 开头的内容。

查找之后使用管道命令“|”进行下一步处理,使用 ```awk -F '#'``` 命令按照等号分割内容(默认按照空格分隔),之后使用 print $1 打印分割后的第一个字符串(即配置项的 key ),接着使用 ```sort``` 命令进行排序,然后使用 ```uniq``` 命令去除重复项,结果输出到临时文件中进行后续的处理。

依次分别处理四个环境的配置文件之后,我们接下来使用 ```diff``` 命令就可以很好的对比文件内容了,使用 ```-B``` 参数可以忽略空白行,然后将对比的结果使用 “>” 输出到 diff.out 文件中,接着以 ```dev``` 环境为基准分别对其他文件进行对比,注意这里使用 “>>” 管道命令将结果追加到第一个比较的结果之后。

完成以上的操作之后就可以查看比较结果了(中间可以输出一些信息来区分每次比较的文件),最后使用 rm 清除创建的临时文件,保持工作空间的干净。

以下为运行的效果,可以快速对比几百行甚至几千上万行的配置文件信息:

如何快速找出properties配置文件缺少的不同配置项

总结

在日常的开发过程中,灵活使用一些命令、工具可以很方便的解决我们所遇到的问题,当然也可以用别的方式来解决,这里给出了一个简单方便的方式来解决问题,也还是不错的,另祝各位开发同学编码顺利,0(error), 0(warnning) ^_^。

参考资料

* 适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

* Linux 命令:grep(文本搜索)

* Linux 命令:awk(文本处理)

* Linux 命令:sort(文本排序)

* Linux 命令:uniq(忽略重复行)

* Linux 命令:diff(文本比较)

版权

> 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

> 原创作者:10086@xiaoi.me 发表于 Xiaoi's Blog:https://blog.xiaoi.me

> 原文链接:https://blog.xiaoi.me/2019/12/11/diff-properties

扫码关注我,在线与我沟通、咨询

Xiaoi's Blog

***转载请保留原文链接以及版权信息***