awk:2つのパターンの間にテキスト+ x行を印刷し、最初の一致が続きます。

awk:2つのパターンの間にテキスト+ 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行に一致します。

レポートにも同様に適用されます。 #Reports + 1行を「最初」#まで一致させます。

最初は次のようなことを試しました。

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

次のオブジェクトリストの場合:

awk '/#Reports/,0'

EOFまで#Reportsからデータを取得します。

ただし、オブジェクトのオブジェクト#Reports#Listオブジェクトはオプションであり、すべての入力ファイルに含まれていないため、#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

キーヘッダーの1つが表示されたら、出力ファイル名を設定します。
変数が設定されている場合は、このファイルに印刷してください。

関連情報