Daniel183
Anmeldungsdatum: 9. Februar 2019
Beiträge: Zähle...
|
Hi Folgendes Problem: Ich mache eine REST-Abfrage über: | curl -X GET "https://"$server"/"$instanz"/services/phonebook/" -H "accept: */*" -H 'Authorization: Basic '$rest -H "Content-Type: application/json" | jq '.' | grep value | cut -c 17-90 | tr -d '",' > t1.txt
|
Allerdings habe ich da zwei "value" 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
"labelList": [
{
"id": 92,
"displayName": "Kd. Nr.",
"type": "generic",
"value": "1234567",
"visible": true
},
{
"id": 93,
"displayName": "Kontaktart",
"type": "generic",
"value": "Perosnen-Name",
"visible": true
}
]
|
Die Label-ID ist bei allen 3.000 Benutzern gleich - nur der Wert ist halt ein anderer.
Ich brauche aber nur den Wert des ersten value in der t1.txt. In der T2.txt bräuchte ich den Wert des zweiten Labels. Hat jemand eine Idee, wie ich das umsetzen kann? Ich danke euch für eure Hilfe MfG
Daniel
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4389
Wohnort: Göttingen
|
Kannst Du mal die Ausgabe von dem curl-Kommando posten, ohne die ganzen Pipes dahinter?
Du machst da auch jeden Fall eine Menge mit cut, grep und co, die Du lieber direkt mit jq machen solltest.
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Kannst Du mal die Ausgabe von dem curl-Kommando posten, ohne die ganzen Pipes dahinter? Du machst da auch jeden Fall eine Menge mit cut, grep und co, die Du lieber direkt mit jq machen solltest.
Dann hab ich ja den ganzen nutzlosen Block an Infos mit allem, was das Ding hergibt...
Das ist 68613 Zeilen. Ich mach ja mit grep und Pipe weil ich immer nur bestimmte Punkte brauche und nicht alles. Ich weiß aber nicht, wie ich sonst festlegen will, dass ich den firstname möchte wenn nicht mit grep.
Aber ich bin offen für Input ☺ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | {
total: 2190
limit: 0
offset: 0
scroll: 0
entries: [
{
type: 028phonebook
id: 719
phonebookType: null
phonebookName: null
displayname: Name
firstname: Vorname
surname: Nachname
phone: 00495562366699999
email: mail@test.de
fax: 0049123456789
mobile: 0049175123456789
homephone: 13266698555
organisation: Beispiel
notes: null
labelList: [
{
id: 92
displayName: Kd. Nr.
type: generic
value: 125588
visible: true
}
{
id: 93
displayName: Kontaktart
type: generic
value: Name
visible: true
}
]
|
MfG
Daniel
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4389
Wohnort: Göttingen
|
Hm, also das sieht jetzt aber ziemlich anders aus, als die andere Ausgabe. Da fehlen ja z.B. die ganzen Quotes. So geht das ja nichtmal durch jq durch, weil es kein valides json ist...
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Doc_Symbiosis schrieb: Hm, also das sieht jetzt aber ziemlich anders aus, als die andere Ausgabe. Da fehlen ja z.B. die ganzen Quotes. So geht das ja nichtmal durch jq durch, weil es kein valides json ist...
Hm
Ne, siehts nicht. Das andere war ja nicht die Ausgabe auf meine Abfrage. Die Ausgabe der Abfrage aus meinem ersten Post wäre:
Und zwar ganz genau so.
Nur bringt mir das ja nichts. Das andere war nur der ufbau des Bereichs der labelList. Entschuldige wenn ich das etwas missverständlich ausgedrückt habe. Ich kann an dem Aufbau aber nichts ändern.
Der ist mir halt so vorgegeben von der REST-API des Herstellers.
Außer du hast eine Idee, wie man das ändern könnte damit es es funktioniert von der Abfrage her. MfG
Daniel Bearbeitet von rklm: Zitat repariert. Bitte Zitate kenntlich lassen! Siehe auch Forum/Syntax.
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4389
Wohnort: Göttingen
|
Also, wenn ich meine Datei jsontext.txt so aussieht:
[
{
"id": 92,
"displayName": "Kd. Nr.",
"type": "generic",
"value": "1234567",
"visible": true
},
{
"id": 93,
"displayName": "Kontaktart",
"type": "generic",
"value": "Perosnen-Name",
"visible": true
}
]
Dann bekomme ich die Values mit :
cat jsontest.txt | jq '.[].value'
"1234567"
"Perosnen-Name"
Willst Du nur den ersten haben, dann nimmst Du nur den ersten Array-Eintrag:
cat jsontest.txt | jq '.[0].value'
"1234567"
Du müsstest dann nur noch den ganzen Json-Pfad, der davor noch kommt, entsprechend in das jq einbauen..
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Ich würde mir stark überlegen das mit einer Skriptsprache zu verarbeiten, die besser mit JSON kann als die Bash - z.B. Python3 mit requests (Paket python3-requests):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #!/usr/bin/env python3
import requests
# Diese Variablen musst du für deinen Server anpassen
server = "myserver"
instance = "myinstance"
rest = "auth_type"
headers = {
"accept": "*/*",
"Authorization": f"Basic {rest}",
"Content-Type": "application/json",
}
r = requests.get(f"https://{server}/{instance}/services/phonebook/", headers)
r.raise_for_status()
for n, entry in enumerate(r.json().get("entries", []), 1):
with open(f"{n:05d}.txt", 'w') as f:
f.write("{}\n".format(entry.get("value")))
|
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Ich würde mir stark überlegen das mit einer Skriptsprache zu verarbeiten, die besser mit JSON kann als die Bash - z.B. Python3 mit requests (Paket python3-requests):
Ja, das wäre schön...aber ich darf auf dem Server nichts installieren, weil das bei uns nicht gewünscht ist...deshalb muss ich mit dem auskommen was ich habe ☹
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Python3 ist ja bei Ubuntu 18.04 vorinstalliert (das gehört zu den essentiellen Paketen, die durch ubuntu-minimal installiert werden). Wenn requests nicht nachinstalliert werden darf, kann man das auch mit urllib und json aus der Standard Library zu Fuß machen.
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Python3 ist ja bei Ubuntu 18.04 vorinstalliert (das gehört zu den essentiellen Paketen, die durch ubuntu-minimal installiert werden). Wenn requests nicht nachinstalliert werden darf, kann man das auch mit urllib und json aus der Standard Library zu Fuß machen.
Oh
Das wusste ich nicht... 😳 Ich hab es jetzt so gelöst: 1
2
3
4
5
6
7
8
9
10
11
12
13 | curl -X GET "https://$server/$instanz/services/phonebook/" -H 'Authorization: Basic '$rest -H "Content-Type: application/json" | jq '.' > $instanz/ausgabe.json
cat $instanz/ausgabe.json | jq '.entries[].displayname' > anzeigename.txt
cat $instanz/ausgabe.json | jq '.entries[].firstname' > vorname.txt
cat $instanz/ausgabe.json | jq '.entries[].surname' > nachname.txt
cat $instanz/ausgabe.json | jq '.entries[].organisation' > organisation.txt
cat $instanz/ausgabe.json | jq '.entries[].phone' > telefonnummer.txt
cat $instanz/ausgabe.json | jq '.entries[].homephone' > privat.txt
cat $instanz/ausgabe.json | jq '.entries[].mobile' > mobile.txt
cat $instanz/ausgabe.json | jq '.entries[].fax' > fax.txt
cat $instanz/ausgabe.json | jq '.entries[].email' > email.txt
cat $instanz/ausgabe.json | jq '.entries[].labelList[0].value' > kdnr.txt
cat $instanz/ausgabe.json | jq '.entries[].labelList[1].value' > kontakt.txt
|
Das funktioniert auch super und ist erheblich schneller und komfortabler als vorher - DANKE DAFÜR!!!! Jetzt gehts bei mir weiter...ich muss die einzelnen Files zu einer .csv zusammenfügen. Im Augenblick mach ich das so: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #
# Erstellt eine .csv für das globale Telefonbuch
paste -d',' kdnr.txt anzeigename.txt kontakt.txt vorname.txt nachname.txt organisation.txt telefonnummer.txt privat.txt mobile.txt fax.txt email.txt> $instanz/globales_telefonbuch_$instanz"_"$edatum.csv
#
# Löscht alle angelegten .txt-Files
rm *.txt
#
Das funktioniert auch soweit ganz gut.
Was ich toll fände wäre aber, wenn ich die Spalten beschriften könnte.
Also das in der ersten Spalte die Überschrift wäre:
"Kundennummer"
oder so.
Danke auf jeden Fall für eure Hilfe!
MfG
Daniel
|
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4389
Wohnort: Göttingen
|
Wegen der Überschrift in der CSV: Die kannst Du ja einfach vor dem paste mit echo erzeugen:
echo Kundennr., Kundenname, ... > $instanz/globales_telefonbuch_$instanz"_"$edatum.csv Und danach bei dem paste musst Du dann halt ">>" statt ">" verwenden...
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12821
|
Daniel183 schrieb:
Ich hab es jetzt so gelöst:
Du räumst gerade einen ganzen Haufen "Useless Use of Cat Awards" ab. 😉 Darüber hinaus kannst Du Dir das Leben deutlich einfacher machen, indem Du den kompletten Dateinamen in eine Variable speicherst.
1
2
3
4
5
6
7
8
9
10
11
12
13 | curl -X GET "https://$server/$instanz/services/phonebook/" -H 'Authorization: Basic '$rest -H "Content-Type: application/json" | jq '.' > $instanz/ausgabe.json
cat $instanz/ausgabe.json | jq '.entries[].displayname' > anzeigename.txt
cat $instanz/ausgabe.json | jq '.entries[].firstname' > vorname.txt
cat $instanz/ausgabe.json | jq '.entries[].surname' > nachname.txt
cat $instanz/ausgabe.json | jq '.entries[].organisation' > organisation.txt
cat $instanz/ausgabe.json | jq '.entries[].phone' > telefonnummer.txt
cat $instanz/ausgabe.json | jq '.entries[].homephone' > privat.txt
cat $instanz/ausgabe.json | jq '.entries[].mobile' > mobile.txt
cat $instanz/ausgabe.json | jq '.entries[].fax' > fax.txt
cat $instanz/ausgabe.json | jq '.entries[].email' > email.txt
cat $instanz/ausgabe.json | jq '.entries[].labelList[0].value' > kdnr.txt
cat $instanz/ausgabe.json | jq '.entries[].labelList[1].value' > kontakt.txt
|
Außerdem ist diese Speicherei in Dateien verdächtig. Willst Du die Daten nicht direkt im Skript weiter verarbeiten? Dann speichert man die einzelnen Werte doch besser in Shell-Variablen.
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Außerdem ist diese Speicherei in Dateien verdächtig. Willst Du die Daten nicht direkt im Skript weiter verarbeiten? Dann speichert man die einzelnen Werte doch besser in Shell-Variablen.
Das würde ich gerne...aber dafür kenn ich mich zu wenig damit aus 😢 Wie müsste ich das machen damit ich dass dann in die .csv bekomme? Entschuldige die dumme Frage... MfG
Daniel
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12821
|
Daniel183 schrieb: Außerdem ist diese Speicherei in Dateien verdächtig. Willst Du die Daten nicht direkt im Skript weiter verarbeiten? Dann speichert man die einzelnen Werte doch besser in Shell-Variablen.
Das würde ich gerne...aber dafür kenn ich mich zu wenig damit aus 😢
| ausgabe="$instanz/ausgabe.json"
...
email=$(jq '.entries[].email' "$ausgabe")
...
echo "EMail is $email"
|
Wie müsste ich das machen damit ich dass dann in die .csv bekomme?
jq kann CSV-Ausgabe produzieren (siehe Manpage).
|
Daniel183
(Themenstarter)
Anmeldungsdatum: 9. Februar 2019
Beiträge: 31
|
Das ist ja toll 😮 😊
Danke schön ☺
|