VirtualBox仮想マシンのUUIDを取得するためにbash関数を作成しようとしています。私はこの分野に慣れていないので、awk
問題を解決するためにそれを使用する方法を学ぶことに集中しようとしています。私も使えることをsed
知っていますcut
私の「生」出力は次のとおりですVBoxManage list vms
。
$ VBoxManage list vms
"FreeBSD" {1aac7062-bd59-47ee-9261-2f6aa8d9ef53}
"Windows 10" {64942de7-beb9-418c-9f52-5befcb6f577b}
"High Sierra" {07f73e1a-a0c4-4190-ade1-79a2e432b4d6}
"Test Machine" {9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
私が望む出力は、特定の仮想マシンのUUIDを取得することです。この場合、「テストマシン」を使って探しています9d0953a7-ca2a-4667-8c5b-1a9f550b2956
(角かっこ{
や}
多数の検索とテストの最後に得られた結論は
$ VBoxManage list vms | awk '/Test Machine/{ sub("{" ,""); sub("}", ""); print $3 }'
9d0953a7-ca2a-4667-8c5b-1a9f550b2956
sub
動作しますが、抽出するにはコマンドを使用する必要があります。
私の質問は単純化する方法はありますか?置換型演算子を使用した操作の一部なor
ので、2つのコマンドを使用する必要はありませんかsub
?
たとえば、試してもawk '/Test Machine/{ sub("{" || "}", ""); print $3'
機能しません。角かっこを含むフィールド全体を印刷します。
{9d0953a7-ca2a-4667-8c5b-1a9f550b2956}
この文字列を抽出するより良い方法はありますか?
答え1
-F awk のフィールド区切り記号です。ここでは、2 つのフィールド区切り文字を使用します。 (どちらか一つ)
VBoxManage list vms | awk -F"[{}]" '/Test Machine/{print $2}'
答え2
他の方法。
VBoxManage list vms | awk -F ' ' '{print substr($2, 2, length($2) - 2)}'
スペースでフィールドを区切る
awk -F ' '
2番目の列を印刷し、最初の文字{
と最後の}
文字を削除します。
'{print substr($2, 2, length($2) - 2)}'
答え3
Gnu grepを使う(Perlスタイルの正規表現を使う):
grep -Po "(?<={)[a-f0-9-]+(?=})"
...つまり、開いている中括弧の直後に閉じる中括弧が続く一連の16進数字とダッシュです。
シンプルなgrepを使う
grep -Eo "([a-f0-9-]+-){4}[a-f0-9-]+"
...つまり、ダッシュで区切られた16進数の5つのグループです。
答え4
$ VBoxManage showvminfo 'Test Machine' --machinereadable | sed -n '/^UUID=/{ s///; s/"//gp; }'
1ce7ffef-8faa-4138-9b92-466698762f62
list vms
サブコマンドを使用する代わりに、showvminfo
特定のシステム(ここではVMと呼ばれる)に関するすべての情報を取得しますTest Machine
。これを使用して、--machinereadable
簡単に解析できる形式でデータを出力します。 VM UUID は次のように出力されます。
UUID="1ce7ffef-8faa-4138-9b92-466698762f62"
このコマンドが検出する内容sed
。そのビットとすべての二重引用符を削除し、残りのUUID=
内容を印刷します。
このsed
コマンドはさまざまな方法で作成できます。たとえば、1つのバリエーションは次のとおりです。
sed -n 's/^UUID="\(.*\)"$/\1/p'