2015-06-20 69 views
1

我有了這樣的許多情況下,JSON文件..:Bash腳本從多線程json的grep變量?

{ 
    "SensorApp": "Open Hardware Monitor", 
    "SensorClass": "Temperature", 
    "SensorName": "Intel Core i7-4790: CPU Core #4", 
    "SensorValue": "31", 
    "SensorUnit": "C", 
    "SensorUpdateTime": 0 
}, 
{ 
    "SensorApp": "Open Hardware Monitor", 
    "SensorClass": "Temperature", 
    "SensorName": "Intel Core i7-4790: CPU Package", 
    "SensorValue": "32", 
    "SensorUnit": "C", 
    "SensorUpdateTime": 0 
}, 
{ 
    "SensorApp": "Open Hardware Monitor", 
    "SensorClass": "Clock", 
    "SensorName": "Intel Core i7-4790: CPU Core #1", 
    "SensorValue": "3899.165", 
    "SensorUnit": "MHz", 
    "SensorUpdateTime": 0 
}, 

等等。我需要分配一個變量,說VAR1到傳感器值:

{ 
    "SensorApp": "Open Hardware Monitor", 
    "SensorClass": "Temperature", 
    "SensorName": "Intel Core i7-4790: CPU Package", 
    "SensorValue": "32", 
    "SensorUnit": "C", 
    "SensorUpdateTime": 0 
}, 

我已經嘗試了一些問題已經在計算器,但他們都不多內襯JSON文件的工作。

任何想法,我可以如何實現這一目標?

回答

5

我不確定是否要將json文件中的值更改爲shell變量的值,或者是否要將shell變量設置爲json中的SensorValue字段的值。

然而,對於這兩個任務,你可以使用jq:在bash

jq -r '.[].SensorValue' file.json | while read -r value ; do 
    # Do something useful with the value 
    echo "$value" 
done 
    • 遍歷JSON值修改從bash的一個JSON文件
    VALUE=123 
    jq ".[].SensorValue = $VALUE" file.json 
    

    更新:在評論你告訴你要提取的SensorValue指出,JSON對象,其中SensorName等於"Intel Core i7-4790: CPU Package"的。在jq您使用的是select()功能爲:

    jq -r '.[] | select(.SensorName == "Intel Core i7-4790: CPU Package").SensorValue' file.json 
    

    輸出:

    32 
    
+0

謝謝!對不起,我很晚才寫這個問題。我需要將這些值從json文件中提取出來。用你的jq解決方案,我如何將它設置爲只從特定部分拉取值?現在它只是吐出所有匹配的變量。 例如,我只想要緊跟在「」Intel Core i7-4790:CPU Package「,」之後的值。 – user2809413

+0

我發現了一個工作,但無論如何感謝! – user2809413

+0

@ user2809413你想到的是'jq',它是其中一個關鍵特性。我已經更新了我的答案並添加了一個例子。請注意,'jq'越來越成爲在shell中使用json的標準工具。 – hek2mgl