私は、ネットワーク管理者がPerl正規表現を使用してSANでいくつかのスナップショットを自動化するのを助けています。私たちのスクリプトは次のことを行います。
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')
スナップショットの署名には2つの部分があります。一方は他方に入れ子になっており、キャプチャグループを使用して名前の一部と実行する必要があるさまざまな後続のコマンドをキャプチャします。私はそれが同じコマンドを繰り返し実行し、正規表現を後で整理できることを知っていますが、基本的にはperlを使用して角括弧を1つずつ出力します。
tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
icsiadmとgrepの結果をキャプチャして、次の結果を取得しようとしています。
iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
そして
r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
私たちが持っている問題は、時々最初の行のパイプが失敗することです。
head: cannot open '–n1' for reading: No such file or directory
もちろん、これはヘッダーの標準入力が空であり、ファイル名を探していることを示すようです。
しかし、常に空でなければならない理由はありません。
これにより:
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
2番目の変数は失敗し、2番目の変数は空です。
ただし、これを反転するとvarsnap1が失敗します。
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
それは奇妙で、私たちは何が起こっているのかわかりません。コマンドラインでgrepの後にiscsiadmコマンドを実行すると、実行するたびに同じ内容が返されます。
何かパイプを台無しにしましたか?
RedHat Enterprise Linuxのヘッドバージョン5.97
答え1
あなたの質問にエラーがあるかもしれませんが(通常のダッシュではなく長いutf8ダッシュ):
$ head –n1
head: cannot open ‘–n1’ for reading: No such file or directory
$ head -n1 # ctrl-d
$
一度だけ発生したのでブラウザの問題だと思います。head
とにかく必要に応じて入力を待ちます。head -n1
次のいずれかに変更してください。
sed -n 1p
awk 'NR==1 {print}' # yay, no potential dash problems
いいですね。これを行う方法はありますが、パイプ要素をスキップしてgrep
パラメータを追加して最初の一致のみを返すように指定することもできます-m 1
。または、両方の要素を削除し、一致perl
する最初の行でのみ機能するように指示します。