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
ファイルを検索する必要があるWebサイトのリストです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"
(例:サイト名+文字列)。次に、3番目のフィールドの値を抽出し、条件が満たされると(2番目のフィールドが2に属し2より大きい)、最初と3番目のフィールドを印刷して行をコメントアウトします。ファイルをその場で編集するわけではありませんが、すべてがうまく機能する場合は、いつでも別のファイルにリダイレクトして元のファイルを上書きできます(最近はオプションがあります)。-ADM
z
master.tbl
-P
p
z
p
stoplist.lst
gnu awk
-i inplace