Datei löschen mit mysql oder spez. Textexport
Ich habe hier ein Problem, dass ich bei allen Lösungsansätzen irgendwo anstehe. Es geht um ein Script, das die Aktualisierung des Telefonbuchs eines Siemens-Handys direkt von meiner mysql-Datenbank ermöglicht. Es soll also mit mysql eine Textdatei in einem spez. Format exportiert werden. Gelöst werden kann das in einem vereinfachten Testbeispiel zB von einem weiteren Rechner mit mysql --host=sv -A --user=ab --password=... adressen --execute="select reihung,name,nr from beispiel into outfile 'test.txt' fields terminated by ',' optionally enclosed by '\"'; Hier ist das Problem, dass mysql eine vorhandene Datei "test.txt" nicht überschreiben will bzw. ich nicht weiß, wie man mysql erlaubt Dateien, wenn möglich im Einzelfall, zu überschreiben. Mit der Bash kann ich die Datei nicht löschen, weil die Datei auf dem anderen Rechner sv liegt und ich mir nicht vorstellen kann auf dem anderen Rechner /var/lib/mysql/adressen _schreibend_ zu exportieren. Versuche ich den Export nicht mit outfile zu machen, sondern, dass ich die Ausgabe von mysql in eine Datei umleite, dann kann ich zwar lokal den Export durchführen, aber das Format stimmt nicht bzw. müßte nachbearbeitet werden. Es müssten dann einige Zeilen am Anfang komplett gelöscht werden und alle Tabulatoren durch Komma ersetzt werden. Die 2. Spalte von insgesamt 3 Spalten müßte von " begrenzt sein. Also auch nicht so nebenbei zu erledigen. Beide Lösungsansätze kommen mir irgendwie als "Würgaround" vor. Andererseits wäre das Script in der 1. Version fertig, wenn das auch noch gelöst ist. Al
Hallo, Am Sun, 26 Oct 2003, Al Bogner schrieb:
Ich habe hier ein Problem, dass ich bei allen Lösungsansätzen irgendwo anstehe.
Es geht um ein Script, das die Aktualisierung des Telefonbuchs eines Siemens-Handys direkt von meiner mysql-Datenbank ermöglicht.
Es soll also mit mysql eine Textdatei in einem spez. Format exportiert werden.
Gelöst werden kann das in einem vereinfachten Testbeispiel zB von einem weiteren Rechner mit mysql --host=sv -A --user=ab --password=... adressen --execute="select reihung,name,nr from beispiel into outfile 'test.txt' fields terminated by ',' optionally enclosed by '\"'; [..] Versuche ich den Export nicht mit outfile zu machen, sondern, dass ich die Ausgabe von mysql in eine Datei umleite, dann kann ich zwar lokal den Export durchführen, aber das Format stimmt nicht bzw. müßte nachbearbeitet werden. Es müssten dann einige Zeilen am Anfang komplett gelöscht werden und alle Tabulatoren durch Komma ersetzt werden. Die 2. Spalte von insgesamt 3 Spalten müßte von " begrenzt sein. Also auch nicht so nebenbei zu erledigen.
echo ' select concat(reihung, ",\"", name, "\",", nr) from adressen.beispiel ' | mysql --host=sv -A --user=ab -p > test.txt Oder du schreibst dir den select/concat Kram in ne Textdatei und gibst die dann mysql via stdin ('mysql ... -p < test.sql > test.txt'). Falls das mit der Passwort-Eingabe im Terminal nicht funktionieren solle, dann muss du wohl oder uebel das Passwort auf der Kommandozeile angeben, was ein Sicherheitsloch ist, da das PW dann z.B. in der Ausgabe von 'ps' erscheint. Jedenfalls: mit 'concat' kannst du dir die Ausgabe beliebig zusammenstricken. HTH, -dnh -- Signaturen sammeln ist eine Droge. Aber die gibt es ganz legal im Usernetz. Und sie sind nicht Ärtztlich verboten. (Jedenfalls noch nicht.) [WoKo in dag°]
Am Sonntag, 26. Oktober 2003 18:48 schrieb David Haller:
Oder du schreibst dir den select/concat Kram in ne Textdatei und gibst die dann mysql via stdin ('mysql ... -p < test.sql > test.txt'). Falls das mit der Passwort-Eingabe im Terminal nicht funktionieren solle, dann muss du wohl oder uebel das Passwort auf der Kommandozeile angeben, was ein Sicherheitsloch ist, da das PW dann z.B. in der Ausgabe von 'ps' erscheint.
Jedenfalls: mit 'concat' kannst du dir die Ausgabe beliebig zusammenstricken.
Das funktioniert leider nicht ganz so. Das hatte ich schon probiert. Aber vermutlich kommt man auf diese Art am leichtesten weiter. Wie entferne ich in einer Textdatei die ersten 3 Zeilen? Wenn möglich, ohne eine weitere Datei anzulegen. Dann sollte es eigentlich klappen. BTW mit "Würgarounds" schreibt das Script bereits direkt von der mysql-DB ins Handy. Die Sicherheitslücken will ich aber wieder schließen. Ich habe einfach mal die Datenbank im mysql-Verzeichni per NFS importiert und die Rechte gelockert. Al
Hallo, Am Sun, 26 Oct 2003, Al Bogner schrieb:
Am Sonntag, 26. Oktober 2003 18:48 schrieb David Haller:
Oder du schreibst dir den select/concat Kram in ne Textdatei und gibst die dann mysql via stdin ('mysql ... -p < test.sql > test.txt'). Falls das mit der Passwort-Eingabe im Terminal nicht funktionieren solle, dann muss du wohl oder uebel das Passwort auf der Kommandozeile angeben, was ein Sicherheitsloch ist, da das PW dann z.B. in der Ausgabe von 'ps' erscheint.
Jedenfalls: mit 'concat' kannst du dir die Ausgabe beliebig zusammenstricken.
Das funktioniert leider nicht ganz so. Das hatte ich schon probiert. Aber vermutlich kommt man auf diese Art am leichtesten weiter.
Wie entferne ich in einer Textdatei die ersten 3 Zeilen? Wenn möglich, ohne eine weitere Datei anzulegen. Dann sollte es eigentlich klappen.
Welche 3 Zeilen? Die ersten 3 Datensaetze oder wie? Da solltest du mit 'where' filtern koennen. Ansonsten: echo 'SELECT ... ' | mysql ... | sed '1,3d' > test.txt (oder gleich weiterpipen ;) -dnh -- Then I touch the CPU fan. Wobble. Fsck. Seems the fan decided it didn't want to be a fan any more, then the poor Athlon puked its guts out, which popped the heatsink loose. -- B. Tomlin
Am Sonntag, 26. Oktober 2003 20:56 schrieb David Haller:
Welche 3 Zeilen? Die ersten 3 Datensaetze oder wie? Da solltest du mit 'where' filtern koennen. Ansonsten:
echo 'SELECT ... ' | mysql ... | sed '1,3d' > test.txt
(oder gleich weiterpipen ;)
Ich meinte die 1. 3 Zeilen, die sehen also so aus: @a:=0 0 export Problem ist, dass ich einen Zähler mehrmals brauche. Daher kommt also @a:=0 0 weil ich die Variable initialisieren muss. Darunter steht dann "export", das von select concat(..) as export kommt. Ohne "as" wird der gesamte concat-Befehl angezeigt und der ist mehrere Zeilen lang. Kannst du bitte die sed-Syntax an hier bereits funktionierendes anpassen: Das erzeugt hier eine Datei mit 3 Zeilen zuviel am Anfang. mysql --host=$MYSQLHOST -A --user=$MYSQLUSER --password=$MYSQLPWD $MYSQLDB --execute="$MYSQLEXPORTCMDME" > $MEIMPORT Ich möchte an den Variablen nichts mehr umbauen. Nach der korrekten Definition dieser Variablen, die jeweils einige Zeilen lang sind, braucht mein Hirn mal Pause, auch wenn der sed Befehl allein nicht so schlimm aussieht. Al
Hallo, Am Sun, 26 Oct 2003, Al Bogner schrieb:
Am Sonntag, 26. Oktober 2003 20:56 schrieb David Haller:
Welche 3 Zeilen? Die ersten 3 Datensaetze oder wie? Da solltest du mit 'where' filtern koennen. Ansonsten:
echo 'SELECT ... ' | mysql ... | sed '1,3d' > test.txt
(oder gleich weiterpipen ;)
Ich meinte die 1. 3 Zeilen,
die sehen also so aus:
@a:=0 0 export
Problem ist, dass ich einen Zähler mehrmals brauche. Daher kommt also @a:=0 0 weil ich die Variable initialisieren muss.
Ach so.
Kannst du bitte die sed-Syntax an hier bereits funktionierendes anpassen:
Das erzeugt hier eine Datei mit 3 Zeilen zuviel am Anfang.
mysql --host=$MYSQLHOST -A --user=$MYSQLUSER --password=$MYSQLPWD $MYSQLDB --execute="$MYSQLEXPORTCMDME" > $MEIMPORT
Ich wuerde dir immer noch empfehlen, die SQL-Kommandos nicht via --execute zu uebergeben, das macht u.a. das quoten WESENTLICH einfacher, besonders wenn du z.B. noch 'cat <<EOF' verwendest, denn dann kannst du innerhalb des <<EOF .. EOF auch "" und '' ohne weiteres quoten verwenden. cat <<EOF | mysql ... $MYSQLDB | sed '1,4d' > $MEIMPORT select concat("foo", bar, ... EOF Oder, vielleicht etwas robuster als mit der Zeilenangabe: cat <<EOF | mysql ... $MYSQLDB | sed '1,/^export/d' > $MEIMPORT select ... EOF Die Zeile mit dem 'export' am Zeilenanfang ist dann die letzte (inklusive) die geloescht wird. Du kannst natuerlich auch das '--execute' verwenden, aber s.o., ich empfehle dir dringend, besonders wenn die Abfrage komplexer ist eine gesonderte Datei (cat Abfrage.sql | mysql ...) oder eben ein "Here"-Dokument wie oben (cat <<EOF ... | ). -dnh -- Wenn man Signaturen essen könnte, hätten in Dag° alle durch mich Gewichtsprobleme. [WoKo in dag°]
participants (2)
-
Al Bogner
-
David Haller