oiooiooioiioooiioiioiooo
Goto Top

Linux im Bash mit Sed Zeilen Vervollständigen

Moin zusammen,

ich sitze hier und singe …

Spaß bei Seite bin echt am verzweifeln.

Ich habe eine Kette gebastelt, mit der ich einige Prozesse dokumentieren möchte.

Diese schaut so aus:

export DISPLAY=:0 && konsole --new-tab -e "/bin/bash -x -c 'ZEIT=\$(date +%s) && \  
echo -e \"\$ZEIT\t$(date '+%Y-%m-%d %H:%M')\t$TESTVARIABLE\" | tee -a test.log && \  
sleep 10 && \
sek=\$(echo \$(date +%s)-$ZEIT | bc) && \
LZEIT=\$(date --date=\"@\$sek\" +%H:%M) && \  
echo 1: \$sek 2: \$ZEIT 3: \$LZEIT && \
sed \\'/^\$ZEIT/s\!\$! 1\t$LZEIT\!\\' test.log && \  
sleep 10 && \
read -rsp $\"Druecken...\n\" -n1 key'"  

Und die Zeile mit dem SED bekomme ich einfach nicht eingebunden.

So einzeln funktioniert es, jedoch nicht im gewünschtem Befehl.
sed '/^1633371441/s!$! 1\t$LZEIT!' test.log  

Und was mir auch noch aufgefallen ist, die Variable wird nicht abgerufen und wird genau so in die Datei geschrieben. …

Hilfe wer kann face-sad

Viele Grüße

Ich

Content-ID: 1344265863

Url: https://administrator.de/contentid/1344265863

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

kaese77
kaese77 05.10.2021 um 09:09:42 Uhr
Goto Top
Hallo Du,

Du musst die Variable $LZEIT auch quoten.

\$LZEIT

VG
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 05.10.2021 um 09:20:44 Uhr
Goto Top
Moin kaese,

Zitat von @kaese77:
Du musst die Variable $LZEIT auch quoten.

Das habe ich auch schon probiert. Das ergibt auch nicht das was ich mir erwünsche.

bildschirmfoto vom 2021-10-05 09-19-39
149569
149569 05.10.2021 aktualisiert um 09:52:12 Uhr
Goto Top
Bash Variablen werden innerhalb von Hochkommas (') nicht aufgelöst, das werden sie nur innerhalb von normalen Anführungszeichen ("), und dort darf man das Dollarzeichen der Variablen natürlich nicht escapen, sonst wird sie erneut nicht aufgelöst.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 05.10.2021 um 10:01:52 Uhr
Goto Top
Verständlich, jedoch steht man jetzt vor einem anderem Problem.

SED braucht die einfachen Hochkommas.

$ sed "/^1633371441/s!$! 1\t$LZEIT!" test.log  
sed: -e expression #1, char 20: unterminated `s' command 

und die einfachen Hochkommas unterbrechen die Kette....
149569
149569 05.10.2021 aktualisiert um 10:14:32 Uhr
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:
SED braucht die einfachen Hochkommas.
Nee das ist natürlich Blödsinn, du musst nur die anderen special chars die innerhalb von normalen Anführungszeichen anders interpretiert werden wie das allein stehende Dollarzeichen etc. via Backslash escapen dann hat auch sed keine Probleme mit Anführungszeichen 😉.
RTFM, dann verstehst du auch wieso und warum und musst nicht nur copy n pasten
https://www.oreilly.com/library/view/learning-the-bash/1565923472/ch01s0 ...
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 05.10.2021 um 10:48:01 Uhr
Goto Top

Danke für den Link. Das ist sehr hilfreich ... Aber ich denke mir, dass ich leider noch immer etwas nicht verstanden habe....

Laut der Tabelle gehört das einfache Hochkomma ' zur den genannten Sonderzeichen, welche mit einem Backslash escapet werden können. Wie du oben auch sehen kannst habe ich es im Vorfeld bereits probiert. Nur Wurde die Kette trotzdem unterbrochen. Wenn ich die Kette so wie die ist in die Konsole eingebe, dann startet es einfach nur die Konsole und führt kein einziges enthaltende Befehl aus. Das gleiche passiert, wenn ich die einzelnen Hochkommas einmal escape

sed \'/^\$ZEIT/s\!\$! 1\t\$LZEIT\!\' test.log && \  

Sobald ich die Zeile entferne, funktioniert alles bestens.

Und die Geschichte mit den Anführungszeichen ergibt folgendes...

$ sed "\/\^1633371441\/s\!\$! 1\\t\$LZEIT!" test.log  
sed: -e expression #1, char 32: unterminated address regex

Char 32 ist nach meiner Zählung das Ausrufezeichen Also setze ich hier auch eine Backslash und bekomme das raus...

sed "\/\^1633371441\/s!\$\! 1\t\$LZEIT!" test.log  
bash: !\: event not found
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 07.10.2021 um 08:40:33 Uhr
Goto Top
Moin,

gibt es wirklich sonnst von niemandem eine Idee?

Viele Grüße

Ich
149569
149569 07.10.2021 aktualisiert um 08:54:09 Uhr
Goto Top
Naja, wieder wie so oft Leichtsinns Fehler und überflüssiges escaping 😉

https://tio.run/##S0oszvj/PzU5I1/B0MzY2Njc0MTE0CknMSmnNEnBriS1uEQvJz@dyy ...

Schon erstaunlich wie viel Zeit manch einer mit so was banalem verpulvert, anstatt sich die Zeit zu nehmen und den Link oben genauer zu lesen 🤪.
Genug Zeit hättest du ja bis heute eigentlich gehabt ...

Gruß ER 🙈
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 07.10.2021 um 09:34:33 Uhr
Goto Top
Zitat von @149569:
Gruß ER 🙈

Hey Er face-smile Du bist echt cool face-smile

Vielen Dank.

Und jetzt kurz zur Verinnerlichung. Das ! wurde in meinem oberem Beispiel als Separator verwendet welche du mit einem Slash ausgetauscht hast.?

Viele Grüße

noch immer Ich :p
149569
Lösung 149569 07.10.2021 aktualisiert um 10:40:12 Uhr
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:
Und jetzt kurz zur Verinnerlichung. Das ! wurde in meinem oberem Beispiel als Separator verwendet welche du mit einem Slash ausgetauscht hast.?
Das spielt keine Rolle , das ist reine Geschmackssache und kannst du einfach wieder durch Ausrufezeichen austauschen.
https://tio.run/##S0oszvj/PzU5I1/B0MzY2Njc0MTE0CknMSmnNEnBriS1uEQvJz@dyy ...
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 07.10.2021 um 13:09:40 Uhr
Goto Top
Lustig… Ich habe mal ein Bild gemacht, sonnst glaubst du es mir ja nicht. :p

bildschirmfoto vom 2021-10-07 13-05-34
149569
149569 07.10.2021 aktualisiert um 13:49:27 Uhr
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:

Lustig… Ich habe mal ein Bild gemacht, sonnst glaubst du es mir ja nicht. :p

bildschirmfoto vom 2021-10-07 13-05-34

Ist doch normal, der Bash Interpreter ist ja auch in den Belangen der Ausrufezeichen ja etwas anderes als sh weil in der Bash das Ausrufezeichen für die History-Expansion genutzt wird! Da ist nix lustig that's by design, und auch ein Grund warum ich oben Slashes statt Ausrufezeichen verwendet habe face-wink Hausaufgabe fürs Wochenende face-wink.

Tipp: Führ mal ein set +H vor der sed Zeile in der Bash aus.
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#History ...
Und schon lüppt das auch in der Bash mit den Ausrufezeichen als Delimiter ohne Anpassung.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 07.10.2021 um 16:20:07 Uhr
Goto Top
Zitat von @149569:
Ist doch normal, der Bash Interpreter ist ja auch in den Belangen der Ausrufezeichen ja etwas anderes als sh weil in der Bash das Ausrufezeichen für die History-Expansion genutzt wird! Da ist nix lustig that's by design,

Jup das macht einen Sinn.

Tipp: Führ mal ein set +H vor der sed Zeile in der Bash aus.
Ich glaube ich komme auch mit Slash zurecht ;) Bash wird sich da schon bei gedacht haben. Ich streiche einfach mal ! als Separator zu verwenden...

Auch danke ich dir für die Hausaufgaben :D