需要从文件中重复的行“分组”中解析文本部分

需要从文件中重复的行“分组”中解析文本部分

我有一个文件,其中包含与 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 }'

相关内容