带有字段分隔符的awk shell变量

时间:2014-08-28 01:41:38

标签: bash awk

我正在尝试创建一个哈希:

 awk -F ';' '/DHCP/ {for(i=1; i<=5; i++) {getline; print $2$1}}' file \
 | awk '{print $1"=>\"0000:0000:0000:1000::"$2"/64\""}'

返回以下内容:

host1=>"0000:0000:0000:1000::2/64"
host2=>"0000:0000:0000:1000::3/64"
host3=>"0000:0000:0000:1000::4/64"
host4=>"0000:0000:0000:1000::5/64"
host5=>"0000:0000:0000:1000::6/64"

这很好,但请注意5中for循环中的awk。如何检索{for循环中file的总行数?

我可以将wc -l用于变量,但是如何将shell变量和字段分隔符;与awk一起使用?

ADD

这就是file的样子:

#rest are dynamically assigned by DHCP server
2   ; host1            ; server1 ; ; ;
3   ; host2            ; sX ;;
4   ; host3            ; plic ;; 
5   ; host4        ; cluc ;;
6   ; host6        ; blah ;;

2 个答案:

答案 0 :(得分:3)

awk -F'[ \t]*;[ \t]*' 'NR > 1 && NF > 1 { print $2"=>\"0000:0000:0000:1000::"$1"/64\"" }'  file

我已经摆脱了对DHCP的检查 - 我只是测试我们是否超过了第一行。并且NF > 1确保我们不会在空行中执行任何操作。

我通过使用更精细的字段分隔符将awk的两种用法合并为一种。它匹配;及其周围的任何空格。

答案 1 :(得分:0)

awk -v IT=$(cat file1|wc -l) -F ';' '/DHCP/ {for(i=1; i<=IT; i++) {getline; print $2$1}}' file \| awk '{print $1"=>\"0000:0000:0000:1000::"$2"/64\""}'

-v标志将外部变量传递给awk。

@Ed Morton on my system catting executed faster  
(precise)cronkilla@localhost:/tmp$ time wc -l < file1
4

real    0m0.003s
user    0m0.001s
sys     0m0.002s
(precise)cronkilla@localhost:/tmp$ time cat file1 | wc -l
4

real    0m0.003s
user    0m0.001s
sys     0m0.001s