2016-12-02 25 views
2

Ich versuche, den JQ-Befehl zu verwenden, um ein Json-Objekt zu filtern, um Schlüssel selektiv zu extrahieren. Hier ist ein Beispiel-Objekt, das ich in der Datei x.txt platziert haben:JQ: Filtern nach Schlüsseln

{ 
    "activities" : { 
     "-KSndgjqvmQkWVKHCpLh" : { 
     "create_device" : "...", 
     "stop_time_utc" : "2016-11-01T23:08:08Z" 
    }, 
     "-KSoBSrBh6PZcjRocGD7" : { 
     "create_device" : "..." 
    }, 
     "-KSptboGjo8g4bieUbGM" : { 
     "create_device" : "...", 
     "stop_time_utc" : "2017-01-17T23:08:08Z" 
    } 
    } 
} 

Der folgende Befehl alle die Aktivität Schlüssel extrahieren kann:

cat x.txt | jq '.activities | keys' 
[ 
    "-KSndgjqvmQkWVKHCpLh", 
    "-KSoBSrBh6PZcjRocGD7", 
    "-KSptboGjo8g4bieUbGM" 
] 

Ich habe googeln und experimentieren für ein paar Stunden, die versuchen, das Objekt zu filtern, um nur die Aktivitätseinträge auszuwählen, die einen stop_time_utc-Wert haben, und etwas wie "select (.stop_time_utc | fromdateiso8601> now") zu verwenden, um nur Aktivitäten auszuwählen, die abgelaufen sind. Zum Beispiel würde Ich mag Filter verwenden, um ein Array aus dem Probenobjekt zu schaffen, mit nur dem einen entsprechenden Eintrag:

[ 
    "-KSndgjqvmQkWVKHCpLh" 
] 

Wird versucht dies mit der Option Tasten der falsche Weg? Irgendwelche Ideen oder Vorschläge würden sehr geschätzt werden.

Dank

Antwort

2

with_entries/1 ist dein Freund, zB:

.activities | with_entries(select(.value | has("stop_time_utc"))) 

produziert:

{ 
    "-KSndgjqvmQkWVKHCpLh": { 
    "create_device": "...", 
    "stop_time_utc": "2016-11-01T23:08:08Z" 
    }, 
    "-KSptboGjo8g4bieUbGM": { 
    "create_device": "...", 
    "stop_time_utc": "2017-01-17T23:08:08Z" 
    } 

Es ist jetzt einfach, zusätzliche Auswahlkriterien an, die Schlüsselnamen von Interesse extrahieren, usw. Zum Beispiel:

.activities 
| with_entries(select((.value.stop_time_utc? | fromdateiso8601?) < now)) 
| keys 
+0

Danke @peak für den Zeiger zu with_entries! Hier ist der vollständige Befehl, den ich jetzt verwende, um die abgelaufenen Aktivitätsnamen zu extrahieren: jq '.activities | with_entries (select (.value | has ("stop_time_utc"))) | with_entries (select (.value.stop_time_utc | fromdateiso8601? DThimsen

Verwandte Themen