awk:打印两个模式之间的文本 + x 行,后跟第一个匹配

awk:打印两个模式之间的文本 + x 行,后跟第一个匹配

以下输入文件:

#Report Nr. 2343215
#Errors 3243
#Date: (Timestampt)
#Informaiton
#
# Headers
# Specs
DLSLWD 0 0 0 0 Jun 22 01:51:16PM 2018
#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#
#Reports
#
Error-Number 123
Error Number 12345
#

我需要的是一个将“对象列表”通过管道传输到新文件中的 awk:

#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#  

并将“报告”放入不同的文件中:

#Reports
#
Error-Number 123
Error Number 12345
#

它匹配 #List of Objects + 3 行,直到“first”#。

报告也是如此:匹配 #Reports + 1 行直到“第一个”#。

起初我尝试了类似的方法:

awk '/#List of Objects/,/#Reports/'

对于后面的对象列表:

awk '/#Reports/,0'

从 #Reports 获取数据直到 EOF。

但因为#Reports#Listof 对象都是可选的,并且并非在每个输入文件中,我不能使用 #Reports 作为“END-Pattern”。所以,我必须匹配 # 但忽略匹配模式后的前 X 次出现的 #。

答案1

Awk script:

extract_pat_space.awk内容:

$0 ~ "^#" pat{ f = 1; hash = 0 }
f { print }
NF == 1 && $1 == "#"{ 
    if (++hash == 2) { f = hash = 0 }
}

用法(对于两种模式):

$ awk -f extract_pat_space.awk -v pat="List" file > list_of_objects.txt
$ awk -f extract_pat_space.awk -v pat="Reports" file > reports.txt

结果:

$ cat list_of_objects.txt 
#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#

$ cat reports.txt 
#Reports
#
Error-Number 123
Error Number 12345
#

答案2

awk '
    /#List of Objects/ {f = "objects.txt"} 
    /#Reports/         {f = "reports.txt"} 
    f                  {print > f}
' file

当您看到关键标题之一时,请设置输出文件名。
如果已设置变量,则打印到该文件。

相关内容