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}' 

おすすめ記事