2013-04-11 167 views
1

希望有人能建议以下内容。将awk输出分配给shell变量

目前我有以下的代码,我是想分配$ 24和$ 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 

但我同时需要$ 90和$ 5在一起......

不使用数组的,谁能告诉我如何分配$ 24和$ 5至shell变量,请在{}括号内?

RGDS

东欧

+0

这可能会帮助:http://stackoverflow.com/a/9001927/1983854 – fedorqui 2013-04-11 09:34:23

回答

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 
+0

尼斯之一!正是我在寻找(在一段时间内):)感谢Glenn – user2269537 2013-04-11 10:37:23