我有一个文件,其中包含与 1 个多播组实例相关的 3-5 行信息,并且该文件包含多个多播组实例:
Group: 239.103.0.64
Source: 10.12.49.30/32
Upstream interface: ge-0/0/7.0
Group: 239.103.0.66
Source: 10.12.49.38/32
Upstream interface: ge-0/0/9.0
Group: 239.103.0.71
Source: 10.12.49.2/32
Upstream interface: ge-0/0/0.0
Downstream interface list:
xe-5/0/0.0
Group: 239.103.0.72
Source: 10.12.49.6/32
Upstream interface: ge-0/0/1.0
Downstream interface list:
xe-5/0/0.0
xe-5/0/1.0
对于每个实例,我希望生成 1 行输出,其中包含多播 IP 地址、源 IP 地址、上游接口和下游接口列表,其中字段由“分隔”:“。我希望上面的输出看起来像这样:
239.103.0.64:10.12.49.30/32:ge-0/0/7.0:
239.103.0.66:10.12.49.38/32:ge-0/0/9.0:
239.103.0.71:10.12.49.2/32:ge-0/0/0.0:xe-5/0/0.0
239.103.0.72:10.12.49.6/32:ge-0/0/1.0:xe-5/0/0.0 xe-5/0/1.0
答案1
awk '
/Group:/ {g=$2; next}
/Source:/ {s=$2; next}
/Upstream interface:/ {u=$3; next}
/Downstream interface list:/ {dflag=1; next}
/^$/ {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
{ if (dflag) { if (d == "") d = $1; else d = d " " $1} }
END {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
'
- 该程序的前三行
awk
相当简单:当您看到相应的标签时,捕获多播 IP 地址、源 IP 地址和上游接口的值。 - 第四行设置一个标志,以便在看到“下游接口列表”标签后,我们知道后续(非空白)行包含下游接口。
- 接下来查看第六行更有意义:如果我们看到“下游接口列表”标签,则收集列出的值,并用空格分隔它们。
- 第五行和第七行几乎相同:当到达空行或文件末尾时,打印出到目前为止收集的数据。
答案2
它不漂亮,但我认为它可以完成工作。
awk -F":" 'BEGIN {RS=""};{$1="";$3=$5=$7=":";gsub(/(\ *)?:(\ *)?/,":");print $0}' test.txt |tr -s " "
答案3
如果您不介意尾随空格,您可以说:
awk -v RS='' -v OFS=':' -F'[:\n] *' '{ print $2, $4, $6, $9 " " $10 }'