这是一个shell脚本片段:
KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $ENV_FILE_LOCATION)
echo ${KVS_VARIABLES}
for kv in ${KVS_VARIABLES}
do
echo $kv
key=$(echo $kv | awk -FS=" " '{print $1}')
value=$(echo $kv | awk -FS=" " '{print $2}')
echo "key: $key | value: $value"
done
我希望输出如下:
key: VAR1 | value: VAL1
...
但是,我得到了:
VAR1 VAL1 VAR2 VAL2 VAR3 VAL3
VAR1
key: VAR1 | value:
VAL1
key: VAL1 | value:
VAR2
key: VAR2 | value:
VAL2
key: VAL2 | value:
VAR3
key: VAR3 | value:
VAL3
key: VAL3 | value:
编辑
文件内容为:
VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
答案 0 :(得分:1)
尝试以下awk脚本:
$ awk -F= -v OFS=' | ' '{$1="key: "$1;$2="value: "$2}1' file
key: VAR1 | value: VAL1
key: VAR2 | value: VAL2
key: VAR3 | value: VAL3
输入和输出字段分隔符设置为=
和|
值。唯一的awk语句是在键和值之前添加字符串。
答案 1 :(得分:0)
与awk无关。
KVS_VARIABLES="VAR1 VAL1
VAR2 VAL2
VAR3 VAL3"
现在使用for kv in ${KVS_VARIABLES}
,您只需遍历单词(单个单词,而不是行)。换行符将被忽略,因为不会对变量进行转义。
现在,您要遍历行或一次读取两个变量并以奇特的方式打印它们。
您可以阅读行(可能就是您想要的):
while read -r key value; do
echo "key: $key | value: $value"
done <<<"$KVS_VARIABLES"
如果没有here strings使用bash> 4,则可以尝试process substitution:
while read -r key value; do
echo "key: $key | value: $value"
done < <(echo "$KVS_VARIABLES")
或旧的管道:
echo "$KVS_VARIABLES" | while read -r key value; do
echo "key: $key | value: $value"
done
您可以一次遍历两个参数:
first=""
for kv in ${KVS_VARIABLES}; do
if [ -z "$first" ]; then
first="$kv"
else
echo "key: $first | value $kv"
first=""
fi
done
要进行测试,请在控制台for kv in ${KVS_VARIABLES}; do echo kv=$kv; done
中进行操作,并观察输出。