2つのファイルがありますmaster.tbl
:sites.lst
このファイルはmaster.tbl
、ポート構成、ポート名、IP アドレスなどを含むサイトのリストです。サイトの説明、コメントなどを含む行もありますが、これらは無関係です。サイト構成を含む行は次のように配置され、スペースで区切られています。
{server} {SITE NAME} {port name} {configuration flags}
ポート名は、小文字のサイト名、ダッシュ、「P」、およびポート番号で構成されます。
例:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
sites.lst
ファイルを検索する必要があるサイトのリストですmaster.tbl
。
次のすべての条件を満たすすべての行をコメントアウトし (#
行の先頭に を挿入)、サーバー名とポート名を ( という名前のファイルに) 抽出する必要があります。stoplist.lst
- 記載されているサイト名を含む
sites.lst
- 「-ADM」を含む
- ポート番号が '2' より大きい (例:
hawaii23-P3
)
上記の例では、master.tbl
ファイルは次のようになります。
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
...そして、次のstoplist.lst
内容が含まれます (HAWAII23
が にあると仮定sites.lst
)。
server01 hawaii23-P3
master.lst
約 300,000 行なので、これを手動で行うのは...良くありません。
答え1
解決策は次のとおりですawk
:
awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl
これはsites.lst
最初に を読み取り、$0"-ADM"
(サイト名 + 文字列-ADM
) を配列 のインデックスとして設定しますz
。次に、3 番目のフィールドのmaster.tbl
後の値を として抽出する処理を行い、条件が満たされた場合 (2 番目のフィールドが であり、2 より大きい場合)、1 番目と 3 番目のフィールドを に出力し、行をコメント アウトします。 ファイルはその場で編集されないことに注意してください。ただし、問題がなければ、いつでも別のファイルにリダイレクトして元のファイルを上書きできます (ただし、最近の ではオプション があります)。-P
p
z
p
stoplist.lst
gnu awk
-i inplace