Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 分析多行文件中的行时,从awk设置变量_Bash_Shell_Awk - Fatal编程技术网

Bash 分析多行文件中的行时,从awk设置变量

Bash 分析多行文件中的行时,从awk设置变量,bash,shell,awk,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 "$ser

我有一个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?

首先,在这种情况下,您不需要使用awk。您可以尝试使用以下内容:

while IFS=':' read -ra array; do 
    # "${array[0]}" => first field
    # "${array[1]}" => second field
    # ...
    # "${array[@]}" => all fields    
done < "$CUSTOMER_SERVERS_FILE"
最后,当您希望在变量中分配命令的输出时,可以执行以下操作:

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

为什么不只是tr':'$'\n'<$文件?@hek2mgl:我不太明白与OP的问题之间的联系。@IdrissNeumann基本上OP只是在新行上输出每个字段。不是吗?@hek2mgl我不这么认为。看看我的答案。我已经看到了,这是有道理的。然而,问题中的例子毫无意义。像个魔术师一样工作。非常感谢您,非常干净简单的解决方案。希望有一天我能学会如何编写bash脚本@我很高兴能帮助你。如果您想提高Bash脚本级别,请毫不犹豫地参考高级Bash脚本指南:+1:尽管我不推荐高级Bash脚本指南。我更愿意指出Lhunah的观点。我也有一个很好的完整课程,更容易开始shell POSIX和bash编程,但不幸的是用法语@jaypal感谢您共享此链接。如果要将数组的每个元素分配给循环体中的一个单独变量,请让read为您完成分配:IFS=:read-r address port path vpn。
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`"