如何在一行中提取awk中的多个IP地址

时间:2016-10-31 09:15:48

标签: awk ipv4

我有一个openstack实例的输出如下:

[atlasadm@atlas (mrf-tenant)]$ nova list --name mrf
+--------------------------------------+--------------+--------+------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ID                                   | Name         | Status | Task State | Power State | Networks                                                                                                                                                                              |
+--------------------------------------+--------------+--------+------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 502ca64d-1661-49d9-8468-9ee4cc574f39 | mrf          | ACTIVE | -          | Running     | mrf_signaling=10.0.0.27; mrf_trusted=fd00:1::1b, 10.1.0.27; mrf_internal=192.168.0.5; mrf_mgmt=131.160.102.4; mrf_rsrv=10.3.0.27; mrf_untrusted=fd00:2::1b, 10.2.0.27 |
+--------------------------------------+--------------+--------+------------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

我现在需要提取三个不同的ip地址并将这三个变量设置为以下示例:

mrf_management=131.160.102.4
mrf_trusted=10.1.0.27
mrf_untrusted=10.2.0.27

我正在尝试这个,但它给我的分号为";"的ip地址如下:

[atlasadm@atlas (mrf-tenant)]$ nova list --name mrf | awk '/trusted/ {print $14 $16}'
10.1.0.27;10.2.0.27;

如何在没有分号的情况下提取这些地址并将变量设置为一行?甚至可以在一行中使用吗?

3 个答案:

答案 0 :(得分:1)

使用GNU awk进行多字符RS和RT:

$ awk -v RS='mrf_[^;|]+' -F'[= ,]+' 'RT{$0=RT" "; print $1"="$(NF-1)}' file
mrf_signaling=10.0.0.27
mrf_trusted=10.1.0.27
mrf_internal=192.168.0.5
mrf_mgmt=131.160.102.4
mrf_rsrv=10.3.0.27
mrf_untrusted=10.2.0.27

如果要从shell调用时使用declare $(awk...)创建带有这些名称的变量。

答案 1 :(得分:0)

也许这可以帮到你。

nova list --name mrf  | awk -F';' '/trusted/ {printf "%s\n%s\n%s\n", $4, $2, $6}' |sed -e 's/\=.*,/=/;s/|//'

nova list --name mrf  | awk -F';' '/trusted/ {printf "%s\n%s\n%s\n", $4, $2, $6}' 

答案 2 :(得分:0)

您的数据似乎在字段中包含字段。如何管道到awk的另一个调用?也许有一种更优雅的方式,但是:

nova list --name mrf  | awk 'BEGIN {FS="|"} ; {print $7}' | awk 'BEGIN {FS=";"} ; /trusted/ {print $1; print $2; print $3; print $4; print $5; print $6}'