Shell脚本:awk的异常行为

时间:2018-06-28 07:31:59

标签: shell

这是一个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

2 个答案:

答案 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中进行操作,并观察输出。