MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 14.08.2024 20:42:46

Ich möchte ein MySQL Select Ergebnis (aus einer Bash Variable) welche folgenden Inhalt hat:

Code: Alles auswählen

+---+---------+
| 3 | Item A |
| 1 | Item B |
| 1 | Item C |
+---+---------+
In eine neue Variable in einer Zeile schreiben:

Code: Alles auswählen

+---+---------+\n| 3 | Item A |\n| 1 | Item B |\n| 1 | Item C |\n+---+---------+
Wie kann ich das am besten im Bash Script lösen?
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von heisenberg » 14.08.2024 20:58:00

Ich finde die Frage doof. Warum möchtest Du so ein (!@?X.:-x) Ausgabeformat? Damit machst Du Dir doch nur das Leben schwer. Auch: Warum möchtest Du das alles serialisiert in einer Zeile haben?

Wie wäre es mit CSV?

Code: Alles auswählen

mysql -D $DBNAME --batch --skip-column-names -e 'select contact_id,name,email from contacts' \
     | sed -e 's/\t/;/g'
Zuletzt geändert von heisenberg am 14.08.2024 21:08:10, insgesamt 6-mal geändert.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von JTH » 14.08.2024 20:58:55

Das ginge mit einer Musterersetzung (Pattern substitution) ${parameter//pattern/string} über alle Treffer:

Code: Alles auswählen

#!/bin/bash

var1="\
a
b
c
"
var2=${var1//$'\n'/\\n}

echo "var1='$var1'"
echo "var2='$var2'"

Pass übrigens auf, dass du mit dem, was du deinen letzten beiden Themen nach machst, nicht bei Bobby Tables landest ;)
heisenbergs Einwurf, ob man das nicht vielleicht anders machen könnte, schließe ich mich an.
Manchmal bekannt als Just (another) Terminal Hacker.

juribel
Beiträge: 337
Registriert: 20.06.2023 10:17:01

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von juribel » 14.08.2024 20:59:57

Meinst du einen Zeilentrenner \n bzw. hex 0a oder ein Backslash-Zeichen "\" gefolgt von einem Buchstaben "n" für deine Ergebnis-Ausgabe?

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 14.08.2024 21:10:10

Hintergrund meiner Frage ist da sich das Ergebnis per cURL und json an Nextcloud Talk schicken möchte:
viewtopic.php?t=190328

Als Message muss ich also den Text genau so übergeben:

Code: Alles auswählen

+---+---------+\n| 3 | Item A |\n| 1 | Item B |\n| 1 | Item C |\n+---+---------+

Code: Alles auswählen

curl [...] -d '{"token": "12345", "message":"+---+---------+\n| 3 | Item A |\n| 1 | Item B |\n| 1 | Item C |\n+---+---------+"}' https://...
Bin für andere Ideen offen, ich muss halt ein paar Zeilen aus der Datenbank bekommen und möchte die in Talk posten.

(die Aufgabe hat sich am Anfang leichter angehört als es jetzt für mich ist) :facepalm:
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 14.08.2024 21:18:05

JTH hat geschrieben: ↑ zum Beitrag ↑
14.08.2024 20:58:55
Pass übrigens auf, dass du mit dem, was du deinen letzten beiden Themen nach machst, nicht bei Bobby Tables landest ;)
heisenbergs Einwurf, ob man das nicht vielleicht anders machen könnte, schließe ich mich an.
Ja ich weiß :D
Irgendwie läuft das heute nicht so rund.
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von heisenberg » 14.08.2024 21:18:55

Die erste Frage ist, wie Du die von Dir gezeigt Ausgabe überhaupt bekommst. Wenn Du den MySQL per Script ausführst, dann schaltet der Client nämlich sofort in den Batch-Modus um - also kein "boxed" Layout mehr. Ich kriege hier auf jeden Fall keine Ausgabe eines boxed-Layouts in eine Variable.

Insofern erneut die Frage: Was möchtest Du eigentlich erreichen? Bis jetzt sehe ich nur, dass Du eine (beliebige) SQL-Abfrage ausführen möchtest und die Ausgabe im Nextcloud-Talk haben möchtest. Warum?

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von heisenberg » 14.08.2024 21:29:00

So vielleicht (also ohne boxed Layout):

Code: Alles auswählen

mysql -D $DATABASENAME -e 'select contact_id,name,email from contacts' 		\
	| while read line
		do echo -n "$line\n"
	done
bzw. etwas angenehmer zu lesen ...

Code: Alles auswählen

serialize() { while read line;do echo -n "$line\n" ;done ; }

mysql -D $DATABASENAME -e 'select contact_id,name,email from contacts' | serialize 

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 14.08.2024 21:45:35

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.08.2024 21:18:55
Wenn Du den MySQL per Script ausführst, dann schaltet der Client nämlich sofort in den Batch-Modus um - also kein "boxed" Layout mehr. Ich kriege hier auf jeden Fall keine Ausgabe eines boxed-Layouts in eine Variable.
Ich schau morgen nochmal nach, es gibt ein (anderes) altes Script das solche select Ausgaben per Mail verschickt, möglich das es auch nicht mehr im "boxed" Format ist/war.
heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.08.2024 21:18:55
Insofern erneut die Frage: Was möchtest Du eigentlich erreichen? Bis jetzt sehe ich nur, dass Du eine (beliebige) SQL-Abfrage ausführen möchtest und die Ausgabe im Nextcloud-Talk haben möchtest. Warum?
Es gibt ein altes PHP Script das den Select macht und ein PDF daraus, das ganze geht dann wieder jeden Tag auf den Drucker.
Nachdem inzwischen alle Kollegen ein Nextcloud Zugang auf Smartphone und Co haben dachte ich mir den Ausdruck sparen wir uns und schicken es in eine Talk Gruppe.

Die Ausgabe soll daher einigermaßen Lesbar sein, das erfüllt den Zweck.
Schlussendlich kann man dabei auch immer was lernen und das habe ich heute eine Menge :wink:

Daher an dieser Stelle, danke für eure Geduld mit meinen Fragen. :hail:
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 14.08.2024 21:46:34

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.08.2024 21:29:00

Code: Alles auswählen

serialize() { while read line;do echo -n "$line\n" ;done ; }

mysql -D $DATABASENAME -e 'select contact_id,name,email from contacts' | serialize 
Das ist ja schick, so etwas hätte ich bei meinen Bash Scripten schon öfter brauchen können, ich teste morgen, danke!
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: MySQL select Ergebis in eine Zeile umwandeln und \n hinzufügen

Beitrag von slu » 19.08.2024 16:58:39

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.08.2024 21:29:00
serialize() { while read line;do echo -n "$line\n" ;done ; }

mysql -D $DATABASENAME -e 'select contact_id,name,email from contacts' | serialize [/code]
Ich musste noch den Parameter -t mitgeben sonst hat die while Schleife nicht funktioniert.
Im cURL habe ich dann das SELECT Ergebnis mit ${ORDERTODAY//|/ } eingebaut um die | zu entfernen.

Das Ergebnis ist sehr gut geworden und ich hab so viel gelernt! Danke euch allen!
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

Antworten