在解析多行文件中的行时从awk设置变量

时间:2014-05-28 14:50:47

标签: bash shell awk

我有一个包含多行的txt文件,每行都描述一个远程服务器,如下所示:

user@server:port:remote_working_path:whether_using_VPN

:char分隔4个字段。

我需要在每个服务器中运行批处理操作,因此我需要解析每一行并设置适当的变量。现在,我编码的是:

while read server;
do
        echo "$server" | awk -F ':' '{print $1}' &&
        echo "$server" | awk -F ':' '{print $2}' &&
        echo "$server" | awk -F ':' '{print $3}'
        echo "$VPN"
        declare $( echo "$server" | awk -F ':' '{print $VPN=$4}' )
        echo 'VPN: '$VPN
done < $CUSTOMER_SERVERS_FILE

此脚本仅打印前3个字段,我的意图还应将$ VPN变量设置为第4个字段。然而,这似乎有点破碎,我无法解决它。我应该如何修改它以便$ VPN = $ 4?

1 个答案:

答案 0 :(得分:7)

首先,在这种情况下,您不需要使用awk。你可以尝试使用类似的东西:

while IFS=':' read -ra array; do 
    # "${array[0]}" => first field
    # "${array[1]}" => second field
    # ...
    # "${array[@]}" => all fields    
done < "$CUSTOMER_SERVERS_FILE"

然后,如果要使用第4个字段设置VPN变量,可以使用:

while IFS=':' read -ra array; do 
    # ...
    VPN="${array[3]}"
done < "$CUSTOMER_SERVERS_FILE"

另一种解决方案:

while IFS=':' read -r address port path vpn trash; do
    # The variables $adress $port $path and $vpn are assigned.
    # $trash is set with other fields if there are more than 4 fields
done

最后,当您想要在变量中分配命令的输出时,您可以执行以下操作:

var="$(command)"
# or
var="`command`"