2017-04-24 26 views
4

我需要從JSON中拉出一個子字符串。在下面的JSON文檔中,我需要結束jq '.[].networkProfile.networkInterfaces[].id'的值換句話說,我只需要A10NICvw4konls2vfbw-data即可傳遞給另一個命令。我似乎無法弄清楚如何使用grep拉一個子字符串。我看起來似乎是正則表達式的例子,但並沒有取得成功。Linux CLI - 如何從JSON jq + grep獲取子字符串?

[ 
    { 
    "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Compute/virtualMachines/A10VNAvw4konls2vfbw", 
    "instanceView": null, 
    "licenseType": null, 
    "location": "centralus", 
    "name": "A10VNAvw4konls2vfbw", 
    "networkProfile": { 
     "networkInterfaces": [ 
     { 
      "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Network/networkInterfaces/A10NICvw4konls2vfbw-data", 
      "resourceGroup": "IPv6v2" 
     } 
     ] 
    } 
    } 
] 
+0

前綴代碼/數據有四個空格。請看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

回答

3

在你的情況,sub(".*/";"")會做的伎倆爲*是貪婪:

.[].networkProfile.networkInterfaces[].id | sub(".*/";"") 
3

試試這個:

jq -r '.[]|.networkProfile.networkInterfaces[].id | split("/") | last' 

-r告訴JQ打印輸出的 「原始」表單 - 在這種情況下,這意味着字符串值周圍沒有雙引號。

至於jq表達,則可以訪問後id要,管道它(還在裏面jq)通過split("/")它變成斜線之間的部分的陣列。穿過last函數(謝謝,@Thor)的管道只返回數組的最後一個元素。

+0

工作很棒!謝謝! – Adoyt

+1

或'。[] | .networkProfile.networkInterfaces []。id | split(「/」)|最後' – Thor

+0

這更清晰了@Thor。偷竊。 –

1

如果你想與grep這裏做它是單向的:

jq -r '.[].networkProfile.networkInterfaces[].id' | grep -o '[^/]*$' 

輸出:

A10NICvw4konls2vfbw-data