以下输入文件:
#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
和#List
of 对象都是可选的,并且并非在每个输入文件中,我不能使用 #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
当您看到关键标题之一时,请设置输出文件名。
如果已设置变量,则打印到该文件。