如何使用 awk 将文本文件中的多个模式捕获为多个文本块并将每个块打印到新文件

问题描述 投票:0回答:1

我有这个绑定 dns 统计文本文件,

sample_data.txt
:

+++ Statistics Dump +++ (1698804161)
++ Incoming Requests ++
            34199522 QUERY
                   2 STATUS
                  12 UPDATE
++ Incoming Queries ++
                   2 RESERVED0
            19539834 A
              203203 NS
              239215 CNAME
               25636 SOA
              235650 PTR
                  96 HINFO
              922800 MX
              616897 TXT
                   5 RP
                  13 AFSDB
                   8 SIG
                   7 KEY
             9112095 AAAA
                  15 LOC
                  18 EID
              339894 SRV
                  75 NAPTR
                   7 KX
                  11 CERT
                 232 A6
                  55 DNAME
                   5 APL
                2172 DS
                  14 SSHFP
                   6 IPSECKEY
                  35 RRSIG
                 183 NSEC
              135429 DNSKEY
                   3 DHCID
                   8 NSEC3
                   6 NSEC3PARAM
                 196 TLSA
                  27 TYPE53
                  21 HIP
                  28 TYPE59
                  20 TYPE60
                  28 TYPE61
                   3 TYPE62
                  73 TYPE63
                 156 TYPE64
             2815625 TYPE65
                2297 SPF
                   7 TYPE108
                  11 TYPE109
                 752 AXFR
                1115 ANY
                   4 DLV
                5530 Others
++ Outgoing Queries ++
[View: default]
[View: _bind]
++ Name Server Statistics ++
            34199536 IPv4 requests received
            33035183 requests with EDNS(0) received
                1433 requests with TSIG received
               74232 TCP requests received
            20645922 auth queries rejected
                4604 recursive queries rejected
                 730 transfer requests rejected
                  12 update requests rejected
            34199536 responses sent
               71843 truncated responses sent
            33035183 responses with EDNS(0) sent
                1433 responses with TSIG sent
            24625387 queries resulted in successful answer
            33852582 queries resulted in authoritative answer
              135913 queries resulted in non authoritative answer
              135913 queries resulted in referral answer
             3911181 queries resulted in nxrrset
                   2 queries resulted in SERVFAIL
             5316014 queries resulted in NXDOMAIN
              210273 other query failures
++ Zone Maintenance Statistics ++
                 234 IPv4 notifies sent
++ Resolver Statistics ++
[Common]
[View: default]
[View: _bind]
++ Cache DB RRsets ++
[View: default]
[View: _bind (Cache: _bind)]
++ Socket I/O Statistics ++
                  27 UDP/IPv4 sockets opened
                   3 TCP/IPv4 sockets opened
                  25 UDP/IPv4 sockets closed
               74330 TCP/IPv4 sockets closed
               74338 TCP/IPv4 connections accepted
                  42 TCP/IPv4 recv errors
++ Per Zone Query Statistics ++
[sampledomain1.com]
             1898118 auth queries rejected
                  77 recursive queries rejected
                  16 transfer requests rejected
                  12 update requests rejected
             5125667 queries resulted in successful answer
            10890351 queries resulted in authoritative answer
               79163 queries resulted in non authoritative answer
               79163 queries resulted in referral answer
             2997088 queries resulted in nxrrset
             2767596 queries resulted in NXDOMAIN
[sampledomain2.com]
            18026742 auth queries rejected
                1945 recursive queries rejected
                  10 transfer requests rejected
            18773892 queries resulted in successful answer
            20863228 queries resulted in authoritative answer
               56644 queries resulted in non authoritative answer
               56644 queries resulted in referral answer
              778332 queries resulted in nxrrset
             1311004 queries resulted in NXDOMAIN
--- Statistics Dump --- (1698804161)

我想做的是使用 awk 捕获每个

[anydomainname]
记录分隔符之间的文本块(不包括它),并将该块输出到新文件。因此,新文件 file1.txt 和 file2.txt 将包含:

文件1.txt

             1898118 auth queries rejected
                  77 recursive queries rejected
                  16 transfer requests rejected
                  12 update requests rejected
             5125667 queries resulted in successful answer
            10890351 queries resulted in authoritative answer
               79163 queries resulted in non authoritative answer
               79163 queries resulted in referral answer
             2997088 queries resulted in nxrrset
             2767596 queries resulted in NXDOMAIN

文件2.txt

            18026742 auth queries rejected
                1945 recursive queries rejected
                  10 transfer requests rejected
            18773892 queries resulted in successful answer
            20863228 queries resulted in authoritative answer
               56644 queries resulted in non authoritative answer
               56644 queries resulted in referral answer
              778332 queries resulted in nxrrset
             1311004 queries resulted in NXDOMAIN

分别。

现在,这就是我正在做的事情:

 awk '/^\[[[:lower:]]/ {p=1; next};
     /^\[[[:lower:]]/ {p=0};
     {if (p==1) {print last} {last=$0}}' sample_data.txt | tail -n+2

这让我明白了:

             1898118 auth queries rejected
                  77 recursive queries rejected
                  16 transfer requests rejected
                  12 update requests rejected
             5125667 queries resulted in successful answer
            10890351 queries resulted in authoritative answer
               79163 queries resulted in non authoritative answer
               79163 queries resulted in referral answer
             2997088 queries resulted in nxrrset
             2767596 queries resulted in NXDOMAIN
            18026742 auth queries rejected
                1945 recursive queries rejected
                  10 transfer requests rejected
            18773892 queries resulted in successful answer
            20863228 queries resulted in authoritative answer
               56644 queries resulted in non authoritative answer
               56644 queries resulted in referral answer
              778332 queries resulted in nxrrset
             1311004 queries resulted in NXDOMAIN

但正如你所看到的,我有两个问题。

  1. 我仍然需要将每个块拆分到其各自的域部分
  2. 然后我需要将该文本块输出到新文件中。

我可以通过扩展当前的 awk 命令,使用

BEGIN
for
条件,然后为每个块打印到文件来完成此操作吗?我现在只是知道我是否可以用 awk 来做到这一点,因为我正在考虑。短暂性脑缺血发作。

bash awk sed grep
1个回答
0
投票

这个

awk
应该适合你:

awk '
/^\[[[:lower:]]/ {
   fn = "file" ++f ".txt"
   next
}
/^[^[:blank:]]/ {
   fn = ""
}
fn {
   print > fn
}' file
© www.soinside.com 2019 - 2024. All rights reserved.