点环境文件 comparison/validation

Dot env file comparison/validation

如果您在特定环境的给定目录中有多个 .env 文件,例如dev.envstaging.envprod.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