AWK子记录(记录中的记录)
在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
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
- 当
标志为false时,打印水平标尺h
- 将网络保存到
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
---------------------------
...