2016-08-03 13 views
0

ich verstehe nicht sed, awk oder grep - ich versuche die letzten 3 Stunden, um ein Ergebnis zu bekommen, aber ich bekomme nicht die richtige Antwort.Bash erhalten Wert von langen String

Was ich: bekomme ich diese Informationen von icloud.com

{u'timeStamp': 1470252602355, u'locationFinished': True, u'longitude': XX.XXXXXXXXXXXXX, u'positionType': u'GPS-Course', u'locationType': None, u'latitude': XX.XXXXXXXXXXXXX, u'isOld': False, u'isInaccurate': False, u'horizontalAccuracy': 200.0} 

diesen Ort meines iphone ist.

aber ich brauche nur die Breite und die Länge. Ich habe versucht mit AWK, sed und Grep - ich werde nicht das richtige Ergebnis.

+0

In der Regel können Sie nicht auf jedes dieser Werkzeuge verlassen JSON zu analysieren, da sie alle Line-orientiert sind, und Sie können nicht vorhersagen, wo Zeilenumbrüche in JSON auftreten können . Verwenden Sie für JSON entwickelte Tools (wie 'jsawk' und' jq', die in den Antworten erwähnt werden) oder verwenden Sie eine Sprache (z. B. Python), die über eine Bibliothek zum Analysieren von JSON verfügt. – chepner

+0

Obwohl, wie genau erhalten Sie dieses Ergebnis? Das sieht mehr wie die Zeichenfolgendarstellung eines Python 'dict' aus, möglicherweise das Ergebnis der Analyse von JSON. – chepner

Antwort

0

hier gehen Sie ...

$ tr ',' '\n' <file | grep '\(lati\|longi\)tude' 
u'longitude': XX.XXXXXXXXXXXXX 
u'latitude': XX.XXXXXXXXXXXXX 

oder ohne tr

$ grep -o '\(lati\|longi\)tude[^,]*' file 
longitude': XX.XXXXXXXXXXXXX 
latitude': XX.XXXXXXXXXXXXX 
1

In sed (wo a.json Ihre Datei ist), wird es nur den Längenwert und den Breitenwert) drucken:

sed "s/.*u'longitude': \([^,]\+\).*u'latitude': \([^,]\+\).*/\1 \2/g" a.json 
+0

Vielen Dank! Das ist genau das, was ich brauche. Ich schwöre, ich werde mehr über Ausdrücke lesen ... – schmucke

1

Aussehen wie ein json. Sie können es mit jsawk analysieren, ich habe es nicht verwendet, aber sieht aus wie es Ihr Problem leicht lösen wird.

echo "your json string" | jsawk "this.latitude" 

Hinweis: Dies wird Antwort geben (Danke sjsam). Handling Regex kann komplexer werden, wenn JSON-String variiert. Also besser, diese Zeichenfolge als JSON nicht als gewöhnliche Zeichenfolge zu behandeln.

+1

@sjsam Ja, stimmt, ich habe meine Antwort bearbeitet. – Devavrata

1

wird diese grep Rohr die Felder hängen bleiben:

grep -o "'l[^:]\+itude':[^,]\+"

0

Wie jsawk, können Sie Verwenden Sie jq, um zu verarbeiten Ihre JSON:

json="{u'timeStamp': 1470252602355, u'locationFinished': True, u'longitude': XX.XXXXXXXXXXXXX, u'positionType': u'GPS-Course', u'locationType': None, u'latitude': XX.XXXXXXXXXXXXX, u'isOld': False, u'isInaccurate': False, u'horizontalAccuracy': 200.0}" 
echo "$json" | jq '.latitude' 
0
$ awk -v RS=',' -F'[\n:][[:space:]]*' '{for (i=1;i<NF;i++) if ($i ~ /(lat|long)itude/) print $(i+1) }' file 
XX.XXXXXXXXXXXXX 
XX.XXXXXXXXXXXXX