AWK子记录(记录内的记录)

use*_*932 2 awk

在awk中处理记录内记录的最佳方法是什么?

我有记录以

Network: 125
 <junk data>
  MAC: AA:AA:AA:AA:AA:AA
  Packets: 5125
 <junk data>
   Client: 1
     <junk data>
      MAC: 30:85:a9:b0:ec:c4
      Packets: 942
     <junk data>
   Client: 2
     <junk data>
      MAC: 30:85:a9:b0:ec:fa
      Packets: 1052
     <junk data>
 <junk data>
Network: 126
...
Run Code Online (Sandbox Code Playgroud)

预期产量

---------------------------
Network: 125
Client: 30:85:a9:b0:ec:c4
Packets: 942
---------------------------

---------------------------
Network: 125
Client: 30:85:a9:b0:ec:fa
Packets: 1052
---------------------------
Run Code Online (Sandbox Code Playgroud)

注意:输出不包含来自网络主体本身的任何数据,例如MAC:AA:AA:AA:AA:AA:AA。

首先,我必须设置

{RS =“网络”;FS =“ \ n”}然后进行一些条件匹配,然后我必须检查Client子记录,并进行一些条件匹配,如果匹配,则仅从此内部记录中打印出某些字段。

awk中是否有RSS“子记录”功能?

awk的〜32000场NF限制也存在问题。我必须处理的数据远不止这些。

谢谢!

Tom*_*ech 5

我认为这可以满足您的需求:

awk 'BEGIN { FS=OFS=": "; hr="----------------" }
!h {print hr; h=1} 
/Network/ {n=$2} 
/Client/ {c=1} 
c && /MAC/ {m=$2} 
c && /Packets/ {p=$2} 
m && p {
    print "Network", n
    print "Client", m 
    print "Packets", p
    print hr "\n"
    m=c=p=h=""
}' input
Run Code Online (Sandbox Code Playgroud)
  • 如果h标志为假,则打印水平线。
  • 将网络保存到 n
  • 仅在客户端内部时将客户端标志设置为true
  • 将客户端MAC保存到 m
  • 将数据包保存到 p
  • mp设置,打印输出和取消标志。

输出:

----------------
Network: 125
Client: 30:85:a9:b0:ec:c4
Packets: 942
----------------

----------------
Network: 125
Client: 30:85:a9:b0:ec:fa
Packets: 1052
----------------
Run Code Online (Sandbox Code Playgroud)

这适用于您显示的输入,但如果之间的空格数Name: Value可能有所不同,则可能需要更改字段分隔符FS="[[:space:]]*:[[:space:]]+"(零个或多个空格字符,一个冒号,然后一个或多个空格字符)。由于MAC地址也包含冒号,因此字段分隔符目前必须至少包含一个空格。如果有问题,请告诉我。