点环境文件 comparison/validation
Dot env file comparison/validation
如果您在特定环境的给定目录中有多个 .env
文件,例如dev.env
、staging.env
和 prod.env
,使用 shell,是否可以检查每个文件是否具有相同的 env var 键,忽略值?
例如,给定以下文件:
dev.env
KEY_1=DEV_VALUE_1
KEY_2=DEV_VALUE_2
staging.env
KEY_1=STAGING_VALUE_1
KEY_2=STAGING_VALUE_2
prod.env
KEY_1=PROD_VALUE_1
KEY_2=PROD_VALUE_2
KEY_3=PROD_VALUE_3
任何人都可以建议一个 awk
命令或类似的命令,因为 prod.env
包含一个额外的密钥,所以 return 一个非零退出代码?这里的目标是验证所有 .env
文件是否在它们声明的键中对齐,主要是在 CI 设置中。
好的,统计每个键的文件,并显示差异。
#! /usr/bin/awk -f
{
keys[]++
}
END {
for( key in keys ) {
if( n == 0 ) {
n = keys[key]
}
if( keys[key] != n ) {
printf "%s appears in %d of %d files\n", \
key, keys[key], n > "/dev/stderr"
}
}
}
$ awk -F= -f ./missing.awk *.env
KEY_3 appears in 1 of 3 files
Can anyone suggest an awk
command or similar that would return a
non-zero exit code due to prod.env
containing an extra key?
我将按照以下方式利用 GNU AWK 完成此任务
awk 'BEGIN{FS="=";PROCINFO["sorted_in"]="@ind_str_asc"}FNR==1{delete arr1}{arr1[]}ENDFILE{keys="";for(i in arr1){keys = keys FS i};arr2[keys];if(length(arr2)>1){exit(1)}}' *.env
说明:我通知 GNU AWK
字段分隔符是 =
并且应该使用排序索引遍历该数组。在每一行的起始行我做清除数组 arr1
,然后对于每一行提到的键是数组第一列的值 arr1
,在处理文件之后,我通过连接构建字符串 keys
arr1
的键使用字段分隔符。这里的遍历顺序很重要,因为它提供了具有不同顺序的相同键的 2 个文件将给出相同的字符串。然后我使用这个字符串作为 arr2
的键,如果 arr2
中有超过 1 个不同的键,我会按照要求使用 non-zero 代码退出。
(在 GNU Awk 5.0.1 中测试)
这里的版本不仅会通知您 mis-aligned 键,还会显示它们的值是什么,以及来自哪个 .env 文件:
mawk 'BEGIN { FS=OFS="="
__++
} __~FNR {++____; _=FILENAME
} {
___[$__]=___[$__]""_""FS""($NF)" | "
} END {
_____=" %s only shows up at ::: %s\n"
for(__ in ___) {
_=___[__]
sub("[ ]*[|][ ]*$","",_)
if(____!=gsub(FS,"&",_)) {
printf(_____,__,_) } } }' test*.env | lgp3
KEY_3 only shows up at ::: testprod.env=PROD_VALUE_3
如果您在特定环境的给定目录中有多个 .env
文件,例如dev.env
、staging.env
和 prod.env
,使用 shell,是否可以检查每个文件是否具有相同的 env var 键,忽略值?
例如,给定以下文件:
dev.env
KEY_1=DEV_VALUE_1
KEY_2=DEV_VALUE_2
staging.env
KEY_1=STAGING_VALUE_1
KEY_2=STAGING_VALUE_2
prod.env
KEY_1=PROD_VALUE_1
KEY_2=PROD_VALUE_2
KEY_3=PROD_VALUE_3
任何人都可以建议一个 awk
命令或类似的命令,因为 prod.env
包含一个额外的密钥,所以 return 一个非零退出代码?这里的目标是验证所有 .env
文件是否在它们声明的键中对齐,主要是在 CI 设置中。
好的,统计每个键的文件,并显示差异。
#! /usr/bin/awk -f
{
keys[]++
}
END {
for( key in keys ) {
if( n == 0 ) {
n = keys[key]
}
if( keys[key] != n ) {
printf "%s appears in %d of %d files\n", \
key, keys[key], n > "/dev/stderr"
}
}
}
$ awk -F= -f ./missing.awk *.env
KEY_3 appears in 1 of 3 files
Can anyone suggest an
awk
command or similar that would return a non-zero exit code due toprod.env
containing an extra key?
我将按照以下方式利用 GNU AWK 完成此任务
awk 'BEGIN{FS="=";PROCINFO["sorted_in"]="@ind_str_asc"}FNR==1{delete arr1}{arr1[]}ENDFILE{keys="";for(i in arr1){keys = keys FS i};arr2[keys];if(length(arr2)>1){exit(1)}}' *.env
说明:我通知 GNU AWK
字段分隔符是 =
并且应该使用排序索引遍历该数组。在每一行的起始行我做清除数组 arr1
,然后对于每一行提到的键是数组第一列的值 arr1
,在处理文件之后,我通过连接构建字符串 keys
arr1
的键使用字段分隔符。这里的遍历顺序很重要,因为它提供了具有不同顺序的相同键的 2 个文件将给出相同的字符串。然后我使用这个字符串作为 arr2
的键,如果 arr2
中有超过 1 个不同的键,我会按照要求使用 non-zero 代码退出。
(在 GNU Awk 5.0.1 中测试)
这里的版本不仅会通知您 mis-aligned 键,还会显示它们的值是什么,以及来自哪个 .env 文件:
mawk 'BEGIN { FS=OFS="="
__++
} __~FNR {++____; _=FILENAME
} {
___[$__]=___[$__]""_""FS""($NF)" | "
} END {
_____=" %s only shows up at ::: %s\n"
for(__ in ___) {
_=___[__]
sub("[ ]*[|][ ]*$","",_)
if(____!=gsub(FS,"&",_)) {
printf(_____,__,_) } } }' test*.env | lgp3
KEY_3 only shows up at ::: testprod.env=PROD_VALUE_3