如果值可以为空,如何在bash中读取键=值对的流?

时间:2019-05-31 13:30:46

标签: bash awk grep

所以我有几个属性文件,其中包含以下格式的键和值:

Key1=value1
Key2=Value2
etc..

因此,当我运行此命令以获取密钥时:

ssh 172.16.1.1 "grep -v '^#' /src/PTB.properties" | awk -F "=" '{print $1}'

我得到以下输出

userField
User
srcIP
srcPort
dstIP
dstPort
date
time

当我运行相同的命令但最后使用{print $2}来获取值时:

ssh 172.16.1.1 "grep -v '^#' /src/PTB.properties" | awk -F "=" '{print $2}'

我得到以下输出:

User-Name
Full-Name
Source-IP-Address
Source-UDP-Port

Target-UDP-Port
Date
Time

所以我想说的是某些键没有值。

话虽如此,我正在运行以下命令来获取这些键和值:

while IFS= read -r line; do
    USER_PARAMETERS_KEYS+=( "$line" )
done < <( ssh $ip "grep -v '^#' ${PARAMETER_PATH[$i]}" | awk -F "=" '{print $1}' )

while IFS= read -r line; do
    USER_PARAMETERS_VALUES+=( "$line" )
done < <( ssh $ip "grep -v '^#' ${PARAMETER_PATH[$i]}" | awk -F "=" '{print $2}' )

我的问题是USER_PARAMETERS_VALUES没有保存空值。例如,运行此命令后,USER_PARAMETERS_VALUES中只有7个项目,而不是8个项目,因为键dstIP为空。

有什么主意我该如何解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:3)

捕获整行并在本地解析它是否更有意义?

while IFS== read -r key value; do
     keys+=("$key")
     values+=("$value")
done < <(ssh 172.16.1.1 "grep -v '^#' /src/PTB.properties")

这也避免了在第一次读取和第二次读取之间远程文件可能发生更改的情况。

话虽如此,最小的变化就是让Awk在任何空值周围打印引号。