Forum: PC-Programmierung Bash programmietung Hilfe


von Jo (Gast)


Lesenswert?

Hallo zusammen,
Ich habe eine Datei die wie folgt aussieht
1
{
2
        "settings":
3
        {
4
                "httpServer":
5
                {
6
                        "enabled": true,
7
                        "port": 5001
8
                },
9
},
10
“plugin“:
11
{
12
…….
13
},
14
}

Nun möchte ich den Port 5001 mit Hilfe von awk und grep auslesen aber 
ich komme nicht so recht auf das gewünschte Ergebnis. Kann mir jmd dabei 
helfen?

von LOL (Gast)


Lesenswert?

Jo schrieb:
> Ich habe eine Datei die wie folgt aussieht
1
{
2
        "settings":
3
        {
4
                "httpServer":
5
                {
6
                        "enabled": true,
7
                         "port": 5001
8
                },
9
},
10
“plugin“:
11
{
12
…….
13
},
14
}
> Nun möchte ich den Port 5001 mit Hilfe von awk und grep auslesen aber
> ich komme nicht so recht auf das gewünschte Ergebnis. Kann mir jmd dabei
> helfen?

Wozu awk?
1
tr -d '\n' <inputfile | grep -oE 'port:[[:space:]]*[0-9]+' | cut -d ':' -f 2

... oder so ähnlich.
Wenn die Zeilenumbrüche fix sind, ist das tr sogar optional, wenn es 
CRLF sind muss halt cr auch noch gelöscht werden.

Das grep -o gibt es bei alten grep-Versionen nicht, heutzutage kann das 
selbst ne Busybox.

von LOL (Gast)


Lesenswert?

Ach Mist, vergessen: In o.g Regex sind die Anführungszeichen nicht drin, 
die müssen noch mit rein, ggf. nochmal mit :space:* vom Doppelpunkt 
getrennt.

Die führenden Leerräume, die man beim cut mitbekommt sind entweder gar 
kein Problem oder man bekommt sie via Variablenzuweisung weg - bash 
trimmt da den Leerraum.

von Timmo H. (masterfx)


Lesenswert?

Awk geht auch:
1
# PORT=$(grep port config_file | awk '{print $2}')
2
# echo $PORT
3
# 5001

: Bearbeitet durch User
von Dirk D. (dicky_d)


Lesenswert?

Das ist ja JSON, willst du da wirklich mit grep/sed/awk ran? was 
passiert wenn sich die Formatierung ändert?
oder kannst du sicherstellen das es immer hübsch-Formatiert ist?
alternativ kannst du jq verwenden, in deinem fall so:
1
$ jq .settings.httpServer.port test.json 
2
5001
3
4
$

von LOL (Gast)


Lesenswert?

Es gibt auch eine json-bash Bibliothek, die läuft mit geringem 
Anpassungsaufwand auch unter dash (busybox).

https://github.com/dominictarr/JSON.sh

Hab ich schon auf NAS-Systemen und Routern gebraucht.

Insofern kann man da durchaus mit grep, awk und sed ran ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.