Hilfe bei sed/grep

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Permittivity
Beiträge: 4
Registriert: 28.08.2015 10:03:24

Hilfe bei sed/grep

Beitrag von Permittivity » 31.08.2015 11:36:35

Hallöchen alle miteinander,

ich habe eine kleine Frage und vermute die Antwort ist eigentlich relativ einfach, aber ich konnte nirgendwo etwas dazu finden...
Und zwar möchte ich nach der Installation von TeamSpeak den Token aus der log-Datei in eine andere Datei kopieren.
Auf meiner Suche nach der Lösung bin ich schon über sed, grep etc. gestolpert, nur bei allen kopiere ich immer die ganze Zeile!
Ich möchte aber, dass alles, was vor dem "token=" steht, nicht übernommen wird und alles, was in der nächsten Zeile danach kommt ebenfalls nicht.

Hat da jemand eine Idee?

Benutzeravatar
whisper
Beiträge: 3184
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Hilfe bei sed/grep

Beitrag von whisper » 31.08.2015 11:41:25

Aus der Hüfte geschossen:

Code: Alles auswählen

grep 'token=' logdatei | cut -d= -f2
Das wird schonmal in die richtige Richtung gehen.

Permittivity
Beiträge: 4
Registriert: 28.08.2015 10:03:24

Re: Hilfe bei sed/grep

Beitrag von Permittivity » 31.08.2015 11:45:30

Das hat perfekt funktioniert, vielen Dank :)

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Hilfe bei sed/grep

Beitrag von uname » 31.08.2015 12:45:21

Permittivity hat geschrieben:Das hat perfekt funktioniert, vielen Dank
Dabei entsprach die Lösung gar nicht ganz deinen Anforderungen. Es wären Logzeilen denkbar, die zu falschen Ausgaben geführt hätten.

Hier mal eine Lösung per awk:

Code: Alles auswählen

awk -F"token=" '{print $2}' logdatei
Ok. Entspricht auch nicht ganz deinen Vorgaben.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Hilfe bei sed/grep

Beitrag von Cae » 31.08.2015 14:00:01

Und der Vollstaendigkeit halber, in sed wuerde man das beispielsweise so loesen:

Code: Alles auswählen

$ sed -n '/token=/s/.*token=\(.*\)/\1/p' data
Erklaerung: das erste /token=/ filtert nur auf Zeilen, die tatsaelich token= enthalten. Das macht die Sache schneller, weil substitute (s///) relativ teuer ist und andernfalls fuer jede (nicht zutreffende) Zeile bemueht werden muesste.

Die RegEx im s/// macht auf "beliebig oft irgendwas, dann "token=" und dann als Gruppe beliebig oft irgendwas. Letztendlich ist die komplette Zeile gematcht, die ich per Backreferenz \1 durch die Gruppe, d.h. alles hinter token=, ersetze. Sofern die Ersetzung erfolgreich war, wird per p wie print die aktuelle Zeile ausgegeben. Dies waere das Standardverhalten, das ich per -n unterdruecke.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Permittivity
Beiträge: 4
Registriert: 28.08.2015 10:03:24

Re: Hilfe bei sed/grep

Beitrag von Permittivity » 31.08.2015 14:26:39

Is zwar schön, dass ihr nocha ndere Lösungsvorschläge anbringt, aber der von whisper hat genau das gemacht, was ich wollte: den Token rausgefiltert.
Zudem ist seine Variante auch die einfachste :D

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Hilfe bei sed/grep

Beitrag von uname » 31.08.2015 14:36:00

Das stimmt vielleicht. Es ist nur die Frage, ob du (und andere Leser) nur ein Problem gelöst haben wollten oder auch etwas dabei lernen wollten. Im übrigen finde ich diese elementaren textbasierten Befehle weit wichtiger als irgendwelche GUI-Fragen. Auch in Jahrzehnten werden nämlich die Befehle weiter funktionieren wenn sich die GUI schon 1000 Mal geändert hat. Du brauchst die Befehle nur einmal im Leben lernen. Am besten heute damit es sich auch lohnt.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Hilfe bei sed/grep

Beitrag von Cae » 31.08.2015 14:47:26

Permittivity hat geschrieben:Zudem ist seine Variante auch die einfachste :D
Und deswegen geht sie auch am einfachsten kaputt ;)

Code: Alles auswählen

$ cat data
login=foo token='bar baz' key=value
$ grep token= data | cut -d= -f2
foo token
$ awk -Ftoken= '{print$2}' data 
'bar baz' key=value
$ sed -n '/token=/s/.*token=\(.*\)/\1/p' data 
'bar baz' key=value
$ 
(unames Variante bricht auch, sobald der Token durch einen doofen Zufall selbst nochmal token= enthaelt) Edit: tut meine natuerlich auch, weil das erste .* greedy ist.

Man darf sich aber immer die Frage stellen, ob man mit entsprechend unerwarteten Eingangsdaten zurechtkommen muss. Imho ist das bei manueller Verarbeitung nicht unbedingt wichtig, da reicht "mal eben hingeklatscht", weil unplausible Ergebnisse sofort auffallen. Sobald die Funktion automatisiert und damit unbeobachtet laufen soll, ist imho unbedingt auf sauberes Verarbeiten zu achten, weil man sich sonst (Jahre spaeter) beim Debuggen einen Wolf sucht. Ich spreche aus Erfahrung, zwei Minuten sauberes Arbeiten ist spassiger als eine Stunde "das kann doch gar nicht sein"-Debugging in den Tiefen irgendwelcher Shellskripte.

Gruss Cae
Zuletzt geändert von Cae am 31.08.2015 15:00:29, insgesamt 1-mal geändert.
Grund: edit wegen greedy .*
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Hilfe bei sed/grep

Beitrag von uname » 31.08.2015 14:53:07

(unames Variante bricht auch, sobald der Token durch einen doofen Zufall selbst nochmal token= enthaelt)
War mir natürlich bekannt und hatte ich kurz angedeutet. Die Option -F ohne Anführungszeichen finde ich im übrigen etwas unleserlich.

Antworten