2

背景: ここでは、テープ ライブラリとバックアップ ソフトウェア NetWorker を使用してデータをバックアップしています。インストールされているクライアントはかなり基本的なものであり、複数のターゲット ディレクトリを復元する必要がある場合は、次の行の X を含むスクリプトを介してバックグラウンドで X クライアント インスタンスを呼び出すだけのスクリプトを作成します。

recover -c client-srv -t "Mon Dec 10 08:00:00" -s barckup-srv -d /dest/dir/ -f -a /src/dir &

問題は、同じマシンから同時にバックアップされた異なるパーティション/ディレクトリが複数の異なるテープに分散している可能性があり、それらのテープの一部がバックアップと復元の間にライブラリから削除されている可能性があることです。

最近まで、ここにいる人々がどのテープが必要かを知る唯一の方法は、ライブラリが特定のテープを持っていないと文句を言うのを待つか、古いデスクトップ GUI で偽の復元をセットアップすることでした。クライアントと特定のメニュー オプションをヒットします。最初のオプションは、テープがオフサイトにあり、元に戻すのに 1 日かかることが判明した場合は非常に悪く、2 番目のオプションは面倒で時間がかかります。

実際の質問: 上記のコマンドで既に作成したスクリプトを読み取り、それを対話型 CLI クライアントにフィードし、必要なテープを吐き出す「メタ」スクリプトを作成しました。実は図書館にいます。これを行うために、スクリプトは次の正規表現を使用して必要な情報を引き出します。

# pull out a list of the -a targets
restore_targets="`sed 's/^.* -a \([^ ]*\) .*$/\1/' $rec_script`"

# pull out a list of -c clients
restore_clients="`sed 's/^.* -c \([^ ]*\) .*$/\1/' $rec_script`"
numclients=`echo $restore_clients | uniq | wc -l`

# pull out a list of -t dates
restore_dates="`sed 's/^.* -t \"\([^\"]*\)\" .*$/\1/' $rec_script`"
numdates=`echo $restore_dates | uniq | wc -l`

名前を覚えていないほど、正規表現の種類の使用にあまり慣れてs/\(x\)/\1/いませんが、これは私がやっていることを達成するための最良の方法ですか? コマンドは機能.*しますが、不必要に使用しているのではないかと思っています。

4

1 に答える 1

1

\1最初のキャプチャ グループを参照します。に置き換えfoo(.*?)\1フィードすると、最初のキャプチャ グループによってキャプチャされたテキストを指すようにfoobar、結果のテキストは になります。bar\1

あなたの質問に関しては、Python (または別の高レベルのスクリプト言語) を使用して引数を解析する方が安全で簡単な場合があります。

>>> import shlex
>>> shlex.split('recover -c client-srv -t "Mon Dec 10 08:00:00" -s barckup-srv -d /dest/dir/ -f -a /src/dir &')
['recover', '-c', 'client-srv', '-t', 'Mon Dec 10 08:00:00', '-s', 'barckup-srv', '-d', '/dest/dir/', '-f', '-a', '/src/dir', '&']

これで、作業がはるかに簡単になりました。引用符がなくなり、コマンドのすべてのコンポーネントがうまく分割されてリストになっています。

これを完全に確実にしたい場合はargparse、このコマンドラインに独自のパーサーを使用して実装するのは非常に簡単です。これにより、情報を簡単に取得できますが、状況によってはやり過ぎになる可能性があります。

実際の質問については、正規表現を分析できます。

^.* -t "([^\"]*)" .*$

この正規表現は をキャプチャ-t "foo \" bar"しますが、貪欲でないバージョンは で停止し-t "foo \"ます。

于 2012-12-20T17:22:28.837 に答える