我正在尝试创建一个哈希:
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一起使用?
这就是file
的样子:
#rest are dynamically assigned by DHCP server
2 ; host1 ; server1 ; ; ;
3 ; host2 ; sX ;;
4 ; host3 ; plic ;;
5 ; host4 ; cluc ;;
6 ; host6 ; blah ;;
答案 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