staging.inyokaproject.org

echo einer Befehlsausgabe bearbeiten

Status: Gelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

marv85

Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: Zähle...

Hallo Ich möchte gern die Ausgabe einer Abfrage um einen Tap nach rechts verschieben. Die Ausgabe ist eine Liste von Usern. Mit \t verschiebt sich nur die erste Zeile. Wie schaffe ich es alle Zeilen zu verschieben? Wenn es gleiche Themen gibt dann wäre der Link sehr gut.

1
2
output=$(sudo mysql -u $name -p$password -e "SELECT USER FROM mysql.user;")
        echo -e "{\t $output}"

Die Ausgabe sieht so aus:

1
2
3
4
5
{	 USER
hummel
marv
meister
root}

Es wird also nur USER eingerückt. Der Rest bleibt links.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Warum rufst du mysql mit sudo auf?

Brauchst du die Ausgabe noch für was anderes oder reicht es das formatiert auszugeben?

mysql -u $name -p$password -e "SELECT USER FROM mysql.user;" | sed 's/^/\t/;1 s/^/\{/;$ a\}' 

marv85

(Themenstarter)
Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Vielen dank für die schnelle Antwort. Mein Fehler... ☺ Sudo ist zur Gewohnheit geworden. 😬 Könntest du mir erklären was die Abkürzungen machen. Vieleicht hast du auch einen guten Link? Das muss ich mir mal genauer anschauen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Also die Ausgabe wird an sed (im Wiki-Artikel werden gängige Konstrukte wie Ersetzungen gezeigt, wenn du es ausführlicher haben willst, schau dir z.B. mal https://tty1.net/sed-tutorium/sed-tutorium.pdf an) weitergeleitet, das führt drei Operationen (die sind jeweils mit einem Strichpunkt voneinander abgetrennt) durch:

  • s/^/\t/ sort dafür, dass am Anfang jeder Zeile ein \t (Tabulator) eingefügt wird (genau genommen ist das eine Ersetzung, bei der ^ auf den Zeilenanfang matcht)

  • 1 s/^/\{/ fügt in der ersten Zeile (daher die 1) am Anfang eine öffnende geschweifte Klammer ein

  • $ a\} hängt nach der letzten Zeile ($) eine schließende geschweifte Klammer in einer neuen Zeile an.

marv85

(Themenstarter)
Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Ok verstehe. Sehr cool danke. Die Ausgabe ist fast perfekt. Ein Tap in sed hat vermutlich ein Zeichen weniger. Soll bedeuten das der Text noch nicht genau unter dem Rest steht. Aber das Leerzeichen in sed finde ich .... Danke nochmal.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Es ist vermutlich einfacher, das Abfrageergebnis von MySQL so zu ändern, dass jedem Wert der Spalte "USER" ein Tab vorangestellt wird. Hast Du das mal versucht?

marv85

(Themenstarter)
Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Es ist vermutlich einfacher, das Abfrageergebnis von MySQL so zu ändern, dass jedem Wert der Spalte "USER" ein Tab vorangestellt wird. Hast Du das mal versucht?

Ich glaube ich weiß worauf du hinaus willst aber deine Aussage ist genau das was sed doch macht oder? Du meinst aber vermutlich das man gleich in mysql alles eistellt...? Oder?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

1
'SELECT "\t", user FROM mysql.user'

Ob der Tab richtig interpretiert wird weiß ich nicht. Wenn es die erste Spalte ist tun es wohl auch 8 Leerzeichen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

user_unknown schrieb:

1
'SELECT "\t", user FROM mysql.user'

Da hast Du eine unbenannte Spalte mit einem konstanten Wert eingeführt. Ich meinte

1
SELECT CONCAT("\t", user) as user FROM mysql.user

Ob der Tab richtig interpretiert wird weiß ich nicht.

Wird er.

Wenn es die erste Spalte ist tun es wohl auch 8 Leerzeichen.

Jo.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

rklm schrieb:

Da hast Du eine unbenannte Spalte mit einem konstanten Wert eingeführt. Ich meinte

1
SELECT CONCAT("\t", user) as user FROM mysql.user

Ob der Tab richtig interpretiert wird weiß ich nicht.

Wird er.

Wenn es die erste Spalte ist tun es wohl auch 8 Leerzeichen.

Jo.

Ja, das hätte den Vorteil, dass da kein Komma o.ä. zwischen den Spalten ausgegeben wird, oder keine zwei Tabs als Separator noch einen, oder welchen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

user_unknown schrieb:

Ja, das hätte den Vorteil, dass da kein Komma o.ä. zwischen den Spalten ausgegeben wird, oder keine zwei Tabs als Separator noch einen, oder welchen?

Der Tab ist ein Tab und bleibt es auch. Man kann den Trenner ja ändern (von der Manpage):

the result is presented in tab-separated format. The output format can be changed using command options.

Und man erhält keine extra Überschrift, weil es kein zusätzliches Feld gibt.

Übrigens müsste Deine Lösung noch einfacher so gehen, denn es wird ja bereits ein Tab als Trenner ausgegeben:

1
SELECT '', user FROM mysql.user

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

rklm schrieb:

Und man erhält keine extra Überschrift, weil es kein zusätzliches Feld gibt.

Übrigens müsste Deine Lösung noch einfacher so gehen, denn es wird ja bereits ein Tab als Trenner ausgegeben:

1
SELECT '', user FROM mysql.user

Wegen der Überschrift dann vielleicht

1
SELECT '' AS '', user FROM mysql.user

Die Details von mySql sind mir aber nicht vertraut, und ich habe hier keine Installation, um das zu testen.

marv85

(Themenstarter)
Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Hallo ihr zwei.

Habe mal eure Varianten getestet:

1
2
3
4
5
6
7
8
9
SELECT CONCAT("\t", user) as user FROM mysql.user;

+----------+
| USER     |
+----------+
|      hummel  |
|      marv    |
|      meister |
+----------+

und

1
2
3
4
5
6
7
8
9
SELECT '' AS '', user FROM mysql.user;

+--+----------+
|  | USER     |
+--+----------+
|  | hummel   |
|  | marv     |
|  | meister  |
+--+----------+

oder

1
2
3
4
5
6
7
8
9
SELECT '', user FROM mysql.user;

+--+----------+
|  | USER     |
+--+----------+
|  | hummel   |
|  | marv     |
|  | meister  |
+--+----------+

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

mysql unterscheidet, ob es auf stdout schreibt oder über eine Umleitung/Pipe Daten ausgibt (in dem Fall lässt es die gezeichnete Tabelle weg) - und du musst ja eh noch die geschweiften Klammern drum herum basteln, also kannst du die Ausgabe von deinem der letzen beiden Ansätze an sed, awk oder ein anderes Programm per Pipe weiterleiden, das das für dich erledigen kann.

marv85

(Themenstarter)
Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

So ... Ich habe mich nun für das beste entschieden. Vielen vielen Dank euch dreien. Das hat mir sehr geholfen und ich habe viel gelernt. Am Wochenende habe ich mich mit sed angefreundet und was noch viel besser ist .... habe mir ein Buch über Shell-Programmierung geholt. Das begeistert mich jetzt schon ! Nochmal vielen dank.

Antworten |