FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: roedert am 20 Februar 2020, 20:18:03

Titel: grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: roedert am 20 Februar 2020, 20:18:03
Ich übernehme gerade einige Teile aus einer älteren-FHEM-Konfiguration. Um mir die define und attr anzuzeigen, nehme ich grep auf die alte cfg-Datei.

grep "^define devicexyz" /opt/fhem.old/fhem.cfg

Wenn jedoch eine Definition über mehrere Zeilen geht, wird mir mit grep natürlich nur die erste Zeile angezeigt. Natürlich kann ich mir mit -A 20 auch die folgenden Zeilen anzeigen lassen.
Aber gibt es evtl auch einen eleganteren Weg mit grep, der mir automatisch die folgenden Zeilen anzeigt wenn diese zusammengehören - was man ja am Backslash als letzten Zeichen in der Zeile erkennen kann?
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: justme1968 am 20 Februar 2020, 20:38:57
nein. grep arbeitet zeilenweise und weiss nichts von irgendwelchen Sonderbehandlungen.

du kannst aber das file vorher mit sed oder perl oder was auch immer passt so ändern das die zeilen zusammen hängen und dann das grep machen. etwas in der art:perl -p -e 's/\\\n/ /' <file> | grep ...
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: Otto123 am 21 Februar 2020, 09:25:05
Hi,

ein ganz andere Weg würde mir noch einfallen:
- Eine zweite Instanz von FHEM mit der alten config starten
- dann mit list -r <devspec> die Definition exakt am Stück herausholen.

Gruß Otto
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: roedert am 21 Februar 2020, 10:00:37
Die alte Config zu starten wollte ich vermeiden, da dort auch etliche LAN-Geräte angesprochen werden.
Und dann könnte einiges "durcheinander" kommen.

Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: Wernieman am 21 Februar 2020, 10:34:06
In einer VM ohne Netzwerk .... wäre meine persönliche Lösung. So sieht man mehr von dem, was eingerichtet ist.
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: Beta-User am 21 Februar 2020, 10:49:22
Hm,

eigentlich sollte es nicht so schwierig sein, sowas wie ein "analysiere eine (andere) cfg, gibt die einzelnen Devices aus und biete eine Option zum Import an"-Modul zu bauen (oder sowas ggf. als Erweiterung für "installer" vorzuschlagen, das bietet ja auch schon einiges, um "fremde" cfg's zu analysieren).
Ist ja ähnlich wie bei attrTemplate: Man sieht, wo das nächste Device anfängt und könnte schlicht Kommentarzeilen, Leerzeilen bzw. solche ohne Inhalt und UUID überspringen...

Also ein "get" mit einer Deviceliste zur Anzeige/Ausgabe in FHEMWEB/telnet und ein "set ... import xyz" (wieder mit der Deviceliste)?

(Ich vermute, dass wir für sowas zunehmend Bedarf haben würden).
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: marv99 am 21 Februar 2020, 18:35:58
Hallo @roedert,

die Autoren der vorherigen Antworten haben recht: Perl, sed und awk sind hier die Werkzeuge der Wahl.

Aber auch mit grep kannst Du die gewünschten Zeilen herausholen, solange die relevanten Zeilen mit einem Backslash enden:
grep "^define devicexyz" /opt/fhem.old/fhem.cfg -A 100 | grep '.*\\$' -v -m 1 -B 100

Dabei muss 100 größer sein, als die maximale Anzahl an Zeilen, die Dein längstes define hat. Bei Bedarf an beiden Stellen einfach vergrößern.
Das erste grep liefert Dir die define-Zeile und 100 nachfolgende Zeilen.
Das zweite grep beschränkt das Ergebnis dann auf die erste Zeile ohne Backslash (am Zeilenende) und liefert genau diese und alle vorigen Zeilen.
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: Beta-User am 24 Februar 2020, 16:52:32
Zitat von: Beta-User am 21 Februar 2020, 10:49:22
eigentlich sollte es nicht so schwierig sein, sowas wie ein "analysiere eine (andere) cfg, [...]"-Modul zu bauen
Hab' mal was gebastelt, kann aber nicht sagen, ob das "der Weisheit letzter Schluß" ist und v.a. nicht ausschließen, dass das üble bugs hat ;D .

"Es" kann jedenfalls: Eine beliebige cfg einlesen - die wird über das Attribut cfgfile festgelegt und mit einem "set ... reread" ausgewertet. In einem Internal stehen dann alle erkannten Devices, mit "get ... device ..." kann man dann ein Gerät wählen und bekommt ein Dialogfeld, in dem die Definition mit sämtlichen Attributen "importfertig" stehen sollte, das Ergebnis ist wieder (auch) in einem Internal zu finden.

Wer mag und kann, kann das gerne "verbessern"; es ist vermutlich am besten, FHEM zusätzlich über eine fast leere cfg zu starten, dort das Hilfsdevice zu definieren und dann die Devices rauszukopieren, die man braucht/sucht, ich habe das auch nur in einem Testsystem verwendet...

Viel Spaß,

Beta-User
Titel: Antw:grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht
Beitrag von: Beta-User am 31 März 2020, 11:54:20
Zur Info:

Habe hier einen neuen Thread zu der modularisierten Variante aufgemacht: https://forum.fhem.de/index.php/topic,109705.msg1036945.html#msg1036945

Alte Fassung kommt daher aus dem vorherigen Beitrag raus.