1

パイプされたnawk内のシェル変数にアクセスしようとしています。私はこれまでこれを行ったことがなく、それが可能かどうか疑問に思っていました。

コマンドのsbdadm list-lu内容は次のとおりです。

2つのLUが見つかりました

          GUID                    DATA SIZE           SOURCE

600144f029bf0a0000004e0484740052 107380964864 / dev / rdsk / c9d0s1 600144f029bf0a0000004e0484740053 53694562304 / dev / rdsk / c9d0s3

これが私のスクリプトのサンプルです:

DISK=/dev/rdsk/c9d0s3
sbdadm list-lu |nawk '/$DISK/ {print}'

/$DISK/: $は正規表現記号の一部であるため、""構文が機能しないことはわかっています。そのようなコードが可能であれば、正しい構文が必要です。

さらに、awkは別のシェルを生成しますか?$DISKもしそうなら、この変数をそのシェルにエクスポートできる可能性はありますか?

4

3 に答える 3

1
export DISK=/dev/rdsk/c9d0s3
cat output | awk '$0 ~ ENVIRON["DISK"]{print}'

結果:

600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

system呼び出しあり (DISK がエクスポートされた後) :

echo | awk '{system("echo $DISK")}'

結果:

/dev/rdsk/c9d0s3

于 2011-06-24T19:30:14.860 に答える
1

jwr の answerに加えて、シェル変数の値で awk 変数を明示的に設定できます。

 nawk -v disk="$DISK" '$3 == disk' output_file
于 2011-06-24T19:46:32.290 に答える
1

問題は、それ$が RE 構文の一部であるということではありません。それ/が RE 区切り文字です。を探しているだけの場合はc9d0s3、適切な引用符を使用するとうまくいきます。

$ DISK=c9d0s3
$ awk "/$DISK/ {print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

説明:""の代わりにを使用すると、プログラムを に渡す前に''シェル変数が展開されるため、awkawk

/c9d0s3/ {print}

そのプログラムとして。その中のパターンを検索することはできますが/、シェルの引用符の魔法が必要です:

$ DISK=/dev/rdsk/c9d0s3
$ awk "{if (match(\$0, \"$DISK\")) print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

いいえ、awkサブシェルを生成しません。なぜでしょうか?そして、環境を介して変数を渡すことができるのに、なぜ変数を渡す必要があるのでしょうか?

于 2011-06-24T19:43:47.470 に答える