ubuntuusers.de

Wert aus Textdatei auslesen

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Schrottie

Avatar von Schrottie

Anmeldungsdatum:
14. Januar 2007

Beiträge: 116

Wohnort: Spandau

Ist es möglich, aus einer "ini-ähnlichen" Textdatei einen Wert auszulesen, der nicht klassisch mit dem Gleichheitszeichen getrennt ist? Die Datei hat folgenden Aufbau:

Wert1: blabla
Wert2: blubbblubb
Wert3: foobar

Ich brauche nun bspw. Wert 3.

Aber ein einfaches

1
2
3
4
#!/bin/bash
CONFIG="./test.txt"
source $CONFIG
echo $Wert3

wie ich es in meinem jugendlichen Leichtsinn für machbar gehalten habe, tut es nicht. Kann mir da evtl. jemand auf die Sprünge helfen?

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Du könntest die Datei entweder per sed in eine Form bringen, die der Bash-Syntax entspricht und sie dann per source einbinden...

1
sed -i "s/: \(.*\)$/=\"\1\"/" <datei>

... oder du liest die Werte auf eine andere Art aus, beispielsweise so:

1
wert3=$(grep "Wert3" <datei> | awk '{print $2}')

Es kommt denke ich darauf an, ob du viele/alle oder nur einzelne Werte aus dieser Datei brauchst.

Schrottie

(Themenstarter)
Avatar von Schrottie

Anmeldungsdatum:
14. Januar 2007

Beiträge: 116

Wohnort: Spandau

Super, das klappt. Vielen Dank! ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ich würde hier das grep weglassen. das kann awk bequem selber:

1
wert3=$(awk '/^Wert3: / {print $2}' <datei>)

Und vorsichtshalber das Suchwort am Zeilenanfang verankern ! - nicht, dass er noch eine falsche Zeile mit erwischt.

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

track schrieb:

Ich würde hier das grep weglassen. das kann awk bequem selber:

Es ginge auch mit sed, sieht dann aber etwas hässlicher aus:

1
2
3
4
5
$ sed -n 's#^Wert3: *\(.*\)$#\1#p' x
foobar
$ wert3=$(sed -n 's#^Wert3: *\(.*\)$#\1#p' x)
$ echo "$wert3"
foobar

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

1
2
3
eval $(echo -e "abc: 14\ng: 9" | sed 's/: /=/')
echo $abc
14

also geht auch

1
eval $(sed 's/: /=/' ./test.txt)

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Also "eval" würde ich vermeiden wo es nur geht, wenn man nicht 100% sagen kann, dass die Eingabedatei korrekt ist. Wenn dir ein Witzbold das eine manipulierte Datei unterjubelt, ist man am Arsch^^ Beispielsweise:

1
2
3
Wert1: 1
Wert2: 2
rm -rf /

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

In der Tat. - eval ist praktisch ein No-go, es reißt immer eine Sicherheitslücke auf !

rklm schrieb:

Es ginge auch mit sed, sieht dann aber etwas hässlicher aus:

1
2
$ sed -n 's#^Wert3: *\(.*\)$#\1#p'  x
foobar

Muss nicht einmal. Du brauchst den Rest der Zeile ja nicht mitzuschleppen:

track@track:~$ sed -n 's/^Wert3: //p'  x
foobar 

Und wenn wir schon bei Kuriositäten sind:
Mit Perl-Lookbefore und der Option -o kann es grep sogar alleine: 😉

track@track:~$ grep -Po '(?<=^Wert3: ).*'  x
foobar 

LG,

track

Antworten |