2016-04-26 23 views
6

Mam więc dane z wiązką wartości znacznika unixowego (w milisekundach). Coś takiego:dat jq i znaczniki czasowe unix

{ 
    "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", 
} 

Bardzo często musimy szukać wierszy w określonym terminie. Czy możliwe jest zapytanie za pomocą jq, podając daty czytelne dla człowieka? 2016-04-25. Zastanawiam się również, czy w inny sposób możliwe, aby wartości jq show były wyświetlane w czytelnej formie?

Na przykład to działa:

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

chociaż to musi być w ciągu kilku sekund, a nie milisekund

Odpowiedz

4

jq 1.5 posiada standardowe funkcje czasu i daty, takie jak strftime, co zostało udokumentowane w instrukcji obsługi online . Jednak wsparcie dla TZ jest bardzo ograniczone i/lub niewiarygodne, jak pokazano tutaj:

$ 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

Oczywiście! Podane dane wejściowe nie są poprawne JSON, ale zakładam, że końcowe przecinki na tych obiektach są usuwane, a obiekty są zawijane w tablicę, która byłaby głównym obiektem dokumentu JSON.

Po pierwsze, możemy przekształcić milisekundy precyzji UNIX pochodzi do drugiego precyzją, która jest co JQ data funkcje oczekiwać, a następnie przekonwertować do terminów czytelnych dla człowieka się spodziewać:

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

Następnie możemy wybrać tylko te elementy, których daty są:

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

Wreszcie możemy umieścić to wszystko razem, biorąc zmienną $date z linii poleceń:

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

świetna odpowiedź. W końcu użyłem tego dla mojego pola Czas: 'jq '.features []. Properties.Time | = (./1000 | strftime ("% Y-% m-% d% H:% M UTC "))" ' –