2016-08-02 20 views
-2

Sie müssen Daten aus einer JSON-Protokolldatei lesen und mithilfe der Shell Analysedaten abrufen Skript.Aus einer JSON-Protokolldatei in einer SHS-Shellskriptdatei lesen und die Analysedaten abrufen, indem die Anzahl der Vorkommen in der Protokolldatei gezählt wird

Protokolldatei enthält json als unten:

{ 
info: 'label1', 
description: 'some desc', 
timestamp: '2016-07-27T06:24:50.335Z' 
} 
{ 
info: 'label2', 
description: 'some desc', 
timestamp: '2016-07-27T06:24:50.335Z' 
} 
{ 
info: 'label2', 
description: 'some desc', 
timestamp: '2016-07-27T06:24:50.335Z' 
} 
{ 
info: 'label2', 
description: 'some desc', 
timestamp: '2016-07-29T06:24:50.335Z' 
} 
{ 
info: 'label3', 
description: 'some desc', 
timestamp: '2016-07-29T06:24:50.335Z' 
} 

Ich brauche das Ergebnis, wie unten (Shell-Skript):

Labels Date     Count 

label1 2016-07-27    1 
label2 2016-07-27    2    
label2 2016-07-29    1 
label3 2016-07-29    1 

Dieses so weit ist ich gehen könnte, Notwendigkeit ein Vorschlag, wie man sich nähert. \

#!/bin/bash 
my_dir=`dirname $0` 
file="out.log" 
#keysFile="$my_dir/keys.txt" 
for log in $(cat $file | jq '{id: .info,time: .timestamp}'); do 
#This is as far as I could get. I was able to read the data in the form of {id: 'label1', time: '2016-07-27T06:24:50.335Z' } 
#Now I need to somehow create a key value thing in shell and store timestamp/label as key and increment the count 
echo $log 
done 
+1

so ... was Hast du versucht? Hast du mit 'jq' gespielt? – fedorqui

+1

Sobald Sie eine Frage gestellt haben, geben Sie auch Beispielcode oder Ausschnitte an, die Sie ausprobiert haben. Wenn möglich, könnten Sie auch Abschnitte im Code angeben, die Fehler werfen. Die SO-Community wird Ihnen helfen können, sobald Sie diese Details zur Verfügung stellen, sondern nur ein QA-Forum. – KartikKannapur

+0

@KartikKannapur Die Post wurde aktualisiert. – Arun

Antwort

0

Ihre Eingabe gegeben, könnte man schaffen, dass diese als CSV-Daten mit:

$ jq -rs ' 
def to_csv($headers): 
    def _object_to_csv: 
     ($headers | @csv), 
     (.[] | [.[$headers[]]] | @csv); 
    def _array_to_csv: 
     ($headers | @csv), 
     (.[][:$headers|length] | @csv); 
    if .[0]|type == "object" then 
     _object_to_csv 
    else 
     _array_to_csv 
    end; 
map({ label: .info, date: .timestamp[:10] }) 
    | group_by(.) 
    | map(.[0] + { count: length }) 
    | to_csv(["label", "date", "count"]) 
' input.json 

Dies ergibt:

"label","date","count" 
"label1","2016-07-27",1 
"label2","2016-07-27",2 
"label2","2016-07-29",1 
"label3","2016-07-29",1 
0

Hier ist ein Ansatz, derreduzieren statt group_by verwendet.

Ihre Daten in out.log Unter der Annahme und die folgenden Filter in filter.jq

["Labels", "Date", "Count"], 
["", "", ""], 
(
    reduce .[] as $r (
     {} 
    ; [$r.info, $r.timestamp[0:10]] as $p 
    | setpath($p;getpath($p)+1) 
) 
    | tostream 
    | select(length==2) 
    | flatten 
) 
| @tsv 

Sie ausführen können

jq -M -s -r -f filter.jq out.log 

Tabula getrennt zu produzieren Ausgabe

Labels Date Count 

label1 2016-07-27 1 
label2 2016-07-27 2 
label2 2016-07-29 1 
label3 2016-07-29 1