awk を使用して、異なる文字間の文字列を抽出します。

awk を使用して、異なる文字間の文字列を抽出します。

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'

関連情報