grep soll weitere Zeilen anzeigen wenn eine Backslash am Ende steht

Begonnen von roedert, 20 Februar 2020, 20:18:03

Vorheriges Thema - Nächstes Thema

roedert

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?

justme1968

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 ...
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

roedert

Die alte Config zu starten wollte ich vermeiden, da dort auch etliche LAN-Geräte angesprochen werden.
Und dann könnte einiges "durcheinander" kommen.


Wernieman

In einer VM ohne Netzwerk .... wäre meine persönliche Lösung. So sieht man mehr von dem, was eingerichtet ist.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marv99

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.

Beta-User

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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors