2016-04-26 12 views
6

Also habe ich eine Daten mit Haufen von Unix-Timestamp-Werten (in Millisekunden). So etwas wie das:jq Daten und Unix-Zeitstempel

{ 
    "id": "f6922fd5-4f97-4113-820e-b45eba0ae236", 
    "published_at": 1461624333859, 
    "tracking_id": "a85d5ed5-5efa-461b-aae0-beb2098c0ff7", 
}, { 
    "id": "835d412f-5162-440c-937b-7276f22c4eb9", 
    "published_at": 1461625249934, 
    "tracking_id": "86472ba2-ce5f-400f-b42a-5a0ac155c42c", 
}, { 
    "id": "bc2efcac-67a0-4855-856a-f31ce5e4618e", 
    "published_at": 1461625253393, 
    "tracking_id": "c005398f-07f8-4a37-b96d-9ab019d586c2", 
} 

Und sehr oft müssen wir nach Zeilen innerhalb eines bestimmten Datums suchen. Ist es möglich, mit jq abzufragen und menschenlesbare Daten, z. 2016-04-25. Auch ich frage mich ob andersherum möglich, jq published_at Werte in lesbarer Form darzustellen?

Zum Beispiel das funktioniert:

$ echo 1461624333 | jq 'todate' 
"2016-04-25T22:45:33Z" 

obwohl es in Sekunden sein muss, nicht Millisekunden

Antwort

4

jq 1.5 verfügt über Standard-Zeit- und Datumsfunktionen wie strftime, wie im Online-Handbuch dokumentiert . Die Unterstützung für TZ ist jedoch extrem begrenzt und/oder unzuverlässig, wie hier dargestellt:

$ echo $TZ 

$ jq -n '123 | strftime("%B %d %Y %I:%M%p %Z")' 
"January 01 1970 12:02AM EST" 

TZ='Asia/Kolkata' jq -n '123 | strftime("%B %d %Y %I:%M%p %Z")' 
"January 01 1970 12:02AM IST" 
7

Sicher! Ihre angegebene Eingabe ist kein gültiger JSON, aber ich nehme an, dass die abschließenden Kommas für diese Objekte entfernt werden und die Objekte in ein Array eingebettet werden, das das Stammobjekt des JSON-Dokuments wäre.

Erstens können wir die Millisekunden-Präzision UNIX Daten in der zweiten Präzision, verwandeln, die, was Datumsfunktionen erwarten die jq ist, und dann, dass Sie zu den Menschen lesbaren Daten konvertieren erwarten: Dann

.[].published_at |= (./1000 | strftime("%Y-%m-%d")) 

, wir wählen nur diejenigen Elemente, deren Daten übereinstimmen:

map(select(.published_at == $date)) 

Schließlich haben wir es alle zusammen, die $date Variable aus der Befehlszeile unter:

jq --arg date "2016-04-25" '.[].published_at |= (./1000 | strftime("%Y-%m-%d")) | map(select(.published_at == $date))' stuff.json 
+0

große Antwort. Ich habe das für mein Time-Feld verwendet: 'jq '.features []. Properties.Time | = (./1000 | strftime ("% Y-% m-% d% H:% M UTC "))' ' –