既存の3par LUNを新しいVmax LUNと交換しようとしています。作業を簡素化するためのスクリプトを書くのに役立つ人はいますか?
3つのLUNを含むファイルとすべて新しいVMAX LUNを含むファイルなど、2つのファイルを作成できますか?その後、すべての内容を交換してくださいmulipath.conf
。
現在私は以下を使用しています:
sed -i "s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g" multipath.conf
誰でもコマンドが機能するのを助けることができますか?
sed "s/`cat 3par.txt`/`cat vmax.txt`/g" multipath.conf
答え1
$ perl -e '
open(F1,"<",shift);
open(F2,"<",shift);
while(<F1>) {
chomp; # strip trailing \n from input file.
$new=<F2>;
chomp $new;
print "s/$_/$new/g\n"
}' file1.txt file2.txt
s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g
s/360002ac000000000000001f20001add8/60002ac000000000000001f20001accc/g
s/360002ac000000000000001f20001add9/60002ac000000000000001f20001accd/g
s/360002ac000000000000001f20001ade0/60002ac000000000000001f20001acce/g
これは一度に1行ずつ書くことができます。読みやすくするために改行を追加しました。
このスクリプトは、他のファイルに対応する行がない限り、ファイルの行に対して偽の出力を生成しますfile1.txt
。file2.txt
だからしないでください。
これらの変更をファイルに適用するには、multipath.conf
上記のperl one-linerを実行し、出力をファイル(たとえばsedscript.sed
)にリダイレクトしてから、次のように実行します。
sed -f sedscript.sed multipath.conf
sed
生成されたスクリプトが必要に応じて動作することを確認してから、出力を新しいファイルにリダイレクトするか、オプションを使用して「sed
その-i
場で」自分で編集しますmultipath.conf
。もちろん、まずバックアップを作成してから-i
(手元に-i.bak
触れない)安全な場所にコピーしてください。
入力ファイルの例は次のとおりです。
$ cat file1.txt
360002ac000000000000001f20001add7
360002ac000000000000001f20001add8
360002ac000000000000001f20001add9
360002ac000000000000001f20001ade0
$ cat file2.txt
60002ac000000000000001f20001accb
60002ac000000000000001f20001accc
60002ac000000000000001f20001accd
60002ac000000000000001f20001acce
しかし、もう少し作業をすると、このPerlシングルライナーはfile1とfile2を読み取り、s / old / new / gオペランドの配列を構成し、それを3番目のファイル(multipath.confなど)に適用します。
たとえば、
#!/usr/bin/perl
# run with three arguments:
# $1 = file containing old patterns
# $2 = file containing replacements
# $3 = file to modify
# THIS SCRIPT IS A CRUDE, MINIMALIST EXAMPLE AND CONTAINS NO ERROR
# CHECKING/HANDLING CODE AT ALL. USE AT OWN RISK.
use strict;
use File::Slurp;
# hash to store the search patterns and their replacements.
my %regex=();
open(F1,"<",shift);
open(F2,"<",shift);
while(<F1>) {
chomp; # strip trailing \n from input file.
my $new=<F2>;
chomp $new;
# qr// pre-compiles the regular expression, so it doesn't have to be
# compiled on every pass through the loop.
$regex{qr/$_/} = $new;
};
close(F1);
close(F2);
my $f3=shift;
my @file3=read_file($f3);
# transform and overwrite the third file.
open(F3,">",$f3);
foreach (@file3) {
foreach my $key (keys %regex) {
s/$key/$regex{$key}/g;
}
print F3;
};
close(F3);
答え2
「old」という名前の2つのファイルが与えられると...
$ cat old
old1
old2
old3
そして「新しい」
$ cat new
new1
new2
new3
次のようにsed用のスクリプトファイルを生成できます。
$ paste old new | while read old new; do printf "s/%s/%s/g\n" "$old" "$new"; done |tee sedfile
s/old1/new1/g
s/old2/new2/g
s/old3/new3/g
このファイルをsedで使用してください。
sed -f sedfile mulipath.conf > review-this.conf