在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限制也存在问题。我必须处理的数据远不止这些。
谢谢!
我认为这可以满足您的需求:
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标志为假,则打印水平线。nmpm和p设置,打印输出和取消标志。输出:
----------------
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地址也包含冒号,因此字段分隔符目前必须至少包含一个空格。如果有问题,请告诉我。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |