次の入力ファイル:
#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つが表示されたら、出力ファイル名を設定します。
変数が設定されている場合は、このファイルに印刷してください。