Reputation: 19
I need to select only one value from the out-table.
The code is:
az vm list-ip-addresses --name VMname --resource-group GroupName --out table
I get the result as below
VirtualMachine PublicIPAddresses PrivateIPAddresses
---------------- ------------------- --------------------
VMName XX.XX.XX.XX XX.XX.XX.XX
I want to select only the PublicIPAddresses
value and extract it to csv.
TIA
Upvotes: 1
Views: 417
Reputation: 439767
Output format option --output table
(-o table
) is meant for human-friendly (tabular) display rather than for programmatic processing.
It's better to use an output format based on structured text, such as JSON.
Indeed, JSON is the default output format, so you can simply omit your --out table
argument and use ConvertFrom-Json
to parse the output and extract the values of interest:
# Outputs all public IP addresses contained in the JSON response.
# Since you're targeting only a *single* VM, the address(es) all refer to that VM.
$ip =
(
az vm list-ip-addresses --name VMname --resource-group GroupName |
ConvertFrom-Json
).virtualMachine.network.publicIpAddresses.ipaddress
The structure of the JSON data returned is assumed to be the same as in this question.
Note that you can streamline the operation by using the --query
parameter to perform a JMESPath query at the source, so that only the values of interest are directly returned:
$ip =
(az vm list-ip-addresses --query '[].virtualMachine.network.publicIpAddresses[].ipAddress' --name VMname --resource-group GroupName |
ConvertFrom-Json)
Note:
--output tsv
, in which case you don't need the ConvertFrom-Json
call - see below.According to this answer, the following shorter alternative that uses the az vm show
sub-command - rather than az vm list-ip-addresses
- works too:
$ip =
az vm show --show-details --resource-group --name vmName --query publicIps --output tsv
Note:
The above uses a different structured text format, TSV (tab-separated values), with --output tsv
, which in this simple case obviates the need for post-processing on the PowerShell side:
# Returns the names and public IP addresses for all VMs in the
# given resource group, as [pscustomobject] instances with
# .name and .publicIds properties (the latter being an array).
$objects =
az vm list-ip-addresses --query '[].virtualMachine.{ name: name, publicIps: network.publicIpAddresses[].ipAddress }' --resource-group GroupName |
ConvertFrom-Json
Upvotes: 1
Reputation: 1
You can add the option -d which will pick up the default defined public IP address:
publicIp='az vm show -g group1 -n vm1 -d --query publicIps -o tsv'
Upvotes: 0