1

希望有人可以就以下内容提出建议。

目前我有以下代码,我想将 $3 和 $5 分配给 {} 括号内的 shell 变量 - 这可能吗:

while read line; do pntadm -P $line | awk '{if (( $2 == 00 && $1 != 00 ) || ( $2 == 04 )) print $3,$5}'; done < /tmp/subnet_list

为了让事情更清楚一点:

root[my-box]# cat /tmp/final_list
111.222.333.0
root[my-box]# pntadm -P 111.222.333.0 | head

Client ID       Flags   Client IP       Server IP       Lease Expiration                Macro           Comment

00A0BCDE1FGHI1  00      111.222.333.001    111.222.333.253     04/06/2013                      macro1
00              04      111.222.333.002    111.222.333.253     Zero                            macro1
00              00      111.222.333.003    111.222.333.253     Zero                            macro1
00A0BCDE1FGHI2  00      111.222.333.004    111.222.333.253     05/06/2013                      macro1
root[my-box]#

我收到的代码应该从上面挑出三行(IP 的 111.222.333.001 ...002 和 ...004)。

如果我只需要例如 $5 的结果,我可以执行以下操作:

while read line; do date=$( pntadm -P $line | awk '{if (( $2 == 00 && $1 != 00 ) || ( $2 == 04 )) print $5}' ); done < /tmp/subnet_list

但我需要 3 美元和 5 美元一起...

如果不使用数组,谁能告诉我如何在 {} 括号内将 $3 和 $5 分配给 shell 变量 - 请?

Rgds

中东欧

4

1 回答 1

2

您不能在“{} 大括号内”分配 shell 变量——您在 awk 进程中对环境所做的任何事情都会在 awk 进程退出时消失。您需要从 awk 打印所需的数据并从 shell 中读取。尝试这个:

while read line; do 
    pntadm -P $line | 
    awk '($2 == "00" && $1 != "00") || ($2 == "04") {print $3,$5}' |
    while read client_ip lease_exp; do
        : do something with $client_ip and $lease_exp
    done 
done < /tmp/subnet_list

或者没有 awk

while read line; do 
    pntadm -P $line |
    while read clientID flags clientIP serverIP leaseExpiration macro comment; do
        if [[ ($flags == "00" && $clientID != "00") || ($flags == "04") ]]; then
            : do something with $clientIP and $leaseExpiration
        fi
    done 
done < /tmp/subnet_list
于 2013-04-11T10:15:43.820 回答