使用 bash 脚本显示配置文件中不在另一个配置中的指令(按行)
Display directives (in lines) from config file that aren't in an another config using bash scripting
有类似的问题,但这是具体的,我的 awk 知识一点也不好(尽管你可以使用任何工具来解决这个问题)。
所以,我正在使用 OpenWRT 配置文件。第一个文件看起来像这样(这是我构建的初始配置(一部分)):
# Use "make defconfig" to expand this to a full .config
# Selecting target and model(s)
CONFIG_TARGET_ar71xx=y
CONFIG_TARGET_ar71xx_generic_ARCHERC7=y
CONFIG_PACKAGE_luci-ssl=y
# we do not need these, since it adds more dependencies
#CONFIG_PACKAGE_mc=y
如您所见,指令(例如'CONFIG_PACKAGE_luci-ssl')通常在此文件中具有值(但这无关紧要),但它们可以被注释掉,并且可以是其中的空行。
假设第二个配置文件如下所示(只是一个基本的完整配置):
#
# Automatically generated file; DO NOT EDIT.
# OpenWrt Configuration
#
CONFIG_MODULES=y
CONFIG_HAVE_DOT_CONFIG=y
# CONFIG_TARGET_ppc40x is not set
# CONFIG_TARGET_realview is not set
# CONFIG_TARGET_atheros is not set
CONFIG_TARGET_ar71xx=y
# CONFIG_TARGET_ar71xx_generic_ARCHERC7 is not set
在第二个配置中,指令通常没有值(这些时候它们被注释掉了)但有时它们可以有。
我想显示第一个文件中根本不在第二个文件中的所有未注释指令(有或没有它们的值(无关紧要)),无论它们被注释掉还是未注释掉。
在这个例子中它只会显示:
CONFIG_PACKAGE_luci-ssl
有一个初始配置文件很好,当您升级到另一个版本时,您可以轻松测试您的配置是否可以用于该版本(是否有任何缺失的设置)。
谢谢!
假设文件名为 1st
和 2nd
,这是一种可能性:
grep -vf<(echo ^#;echo ^$;sed -n 's/.*=y/^&/p;s/# \(.*\) is not set/^=/p' 2nd) 1st
<(
)
之间的命令生成在 1st
中搜索的模式列表:
^#
行以 #
开头
^$
行开始和立即结束,i。 e.空
^.*=
行以来自 2nd
的指令开头
由于选项 -v
,这些匹配行没有显示,留下了想要的非匹配行。
FILE1="../configs/init.config"; FILE2=".config"; grep -v "^#" "$FILE1" | grep -v "^$" | grep -F -x -v -f "$FILE2" -
有类似的问题,但这是具体的,我的 awk 知识一点也不好(尽管你可以使用任何工具来解决这个问题)。 所以,我正在使用 OpenWRT 配置文件。第一个文件看起来像这样(这是我构建的初始配置(一部分)):
# Use "make defconfig" to expand this to a full .config
# Selecting target and model(s)
CONFIG_TARGET_ar71xx=y
CONFIG_TARGET_ar71xx_generic_ARCHERC7=y
CONFIG_PACKAGE_luci-ssl=y
# we do not need these, since it adds more dependencies
#CONFIG_PACKAGE_mc=y
如您所见,指令(例如'CONFIG_PACKAGE_luci-ssl')通常在此文件中具有值(但这无关紧要),但它们可以被注释掉,并且可以是其中的空行。 假设第二个配置文件如下所示(只是一个基本的完整配置):
#
# Automatically generated file; DO NOT EDIT.
# OpenWrt Configuration
#
CONFIG_MODULES=y
CONFIG_HAVE_DOT_CONFIG=y
# CONFIG_TARGET_ppc40x is not set
# CONFIG_TARGET_realview is not set
# CONFIG_TARGET_atheros is not set
CONFIG_TARGET_ar71xx=y
# CONFIG_TARGET_ar71xx_generic_ARCHERC7 is not set
在第二个配置中,指令通常没有值(这些时候它们被注释掉了)但有时它们可以有。
我想显示第一个文件中根本不在第二个文件中的所有未注释指令(有或没有它们的值(无关紧要)),无论它们被注释掉还是未注释掉。 在这个例子中它只会显示:
CONFIG_PACKAGE_luci-ssl
有一个初始配置文件很好,当您升级到另一个版本时,您可以轻松测试您的配置是否可以用于该版本(是否有任何缺失的设置)。 谢谢!
假设文件名为 1st
和 2nd
,这是一种可能性:
grep -vf<(echo ^#;echo ^$;sed -n 's/.*=y/^&/p;s/# \(.*\) is not set/^=/p' 2nd) 1st
<(
)
之间的命令生成在 1st
中搜索的模式列表:
^#
行以#
开头
^$
行开始和立即结束,i。 e.空^.*=
行以来自2nd
的指令开头
由于选项 -v
,这些匹配行没有显示,留下了想要的非匹配行。
FILE1="../configs/init.config"; FILE2=".config"; grep -v "^#" "$FILE1" | grep -v "^$" | grep -F -x -v -f "$FILE2" -