AWK子记录(记录中的记录)

AWK子记录(记录中的记录),awk,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 <jun

在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
...
注意:输出musn不包括来自网络主体本身的任何数据,如MAC:AA:AA:AA:AA:AA:AA:AA

首先,我必须设置

{RS=“网络”FS=“\n”} 然后做一些条件匹配,然后我必须检查客户机子记录,还要做一些条件匹配,如果匹配,只打印出这个内部记录中的某些字段

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

此外,awk的~32000个字段NF限制也存在问题。我需要处理的数据远不止这些

谢谢

awk中的单向

awk '/^Network/{a=$0}/    MAC:/{b=$2}
/    Packets/{print"------------------------------\n" a"\n","Client: "b"\n",$0"\n------------------------------"}' file
另一种在客户端上设置标志的方法

awk 'BEGIN{c="------------------------------\n"}
{gsub(/[ ][ ]+/,"")}
/^Network/{a=$0;x=0}
/Client/{x=1}
x&&/MAC:/{b=$2}
x&&/Packets/{print c a"\n","Client: "b"\n",$0"\n"c}' file

我认为这正是你想要的:

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
  • h
    标志为false时,打印水平标尺
  • 将网络保存到
    n
  • 仅当在客户端内时,才将客户端标志设置为true
  • 将客户端MAC保存到
    m
  • 将数据包保存到
    p
  • 当设置了
    m
    p
    时,打印输出和取消设置标志
输出:

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

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

---------------------------
Network: 125
Client: 30:85:a9:b0:ec:fa
Packets: 1052
---------------------------
...
这适用于您显示的输入,但如果
名称:值
之间的空格数可能不同,您可能需要更改字段分隔符
FS=“[:space:][]*:[:space:][]+”
(零个或多个空格字符、冒号,然后是一个或多个空格字符)。由于MAC地址还包含冒号,因此字段分隔符此时必须至少包含一个空格。如果有问题,请告诉我。

使用GNU Awk:

gawk -v RS='Network: ' -F 'Client: ' -v hl=--------------------------- '{gsub(/\n.*$/, "", $1); for(i=2;i<=NF;++i){if(match($i, /.*MAC: ([[:alnum:]:]+).*Packets: ([0-9]+).*/, a)) printf "%s\nNetwork: %s\nClient: %s\nPackets: %s\n%s\n\n", hl, $1, a[1], a[2], hl } }' file

您可以基于另一个分隔符拆分记录:
split($1,a,“:”)
将基于分隔符
切片
$1
,并存储在数组
a
中。缩进是否一致?不,两个网络记录,这两个客户端记录都可以有更多/更少的字段,而且它不是xml文件,只是普通的txt文件。您如何识别这些字段。你能举一个更实用的输入示例吗?仍然不知道你想要什么,但你可以尝试类似于
awk'/^Network/{a=$0}/[]+Client/{b=$0}/非常好的输入示例,同样,这是一个带有(适当)解释的答案。
#!/usr/bin/gawk -f
BEGIN {
    RS = "Network: "
    FS = "Client: "
    hl = "---------------------------"
}
{
    gsub(/\n.*$/, "", $1)
    for (i = 2; i <= NF; ++i)
        if (match($i, /.*MAC: ([[:alnum:]:]+).*Packets: ([0-9]+).*/, a))
            printf "%s\nNetwork: %s\nClient: %s\nPackets: %s\n%s\n\n", hl, $1, a[1], a[2], hl
}
---------------------------
Network: 125
Client: 30:85:a9:b0:ec:c4
Packets: 942
---------------------------

---------------------------
Network: 125
Client: 30:85:a9:b0:ec:fa
Packets: 1052
---------------------------
...