Verketten mehrerer Befehle in einem Aufruf

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kochi09
Beiträge: 2
Registriert: 19.04.2017 14:57:31

Verketten mehrerer Befehle in einem Aufruf

Beitrag von kochi09 » 08.10.2018 15:57:38

Hallo zusammen,

ich versuche gerade eine Verkettung mehrerer Befehle und das Auftreten eine Fehlers mitzubekommen.
Dazu folgende Informationen:
Im Ordner /tmp werden log-Einträge in die Datei messages.xyz geschrieben. (xyz = fortlaufende Nr) Um immer die neueste Datei zu erwischen verwende ich

ls -S /tmp | grep messages | tail -1

Das klappt soweit gut. Beispielergebnis: messages.400

Wenn ich jetzt mit tail -f diese Datei beobachte und nur Einträge mit dem Suchmuster .srv angezeigt haben will mache ich das so:

tail -f messages.400 | grep .srv

Das klappt auch, aber ich kann diese beiden Befehlsketten nicht ineinander verschachteln.

Mein Versuch war, mittels runder Klammern einzusetzen
tail -f (ls -S /tmp | grep messages | tail -1) | grep for.srv

Habe dazu noch nichts funktionierendes über die Suche gefunden, aber vermutlich ist es nur eine Kleinigkeit.
Hat jemand einen Tipp für mich?

Gruß kochi

Benutzeravatar
MSfree
Beiträge: 10742
Registriert: 25.09.2007 19:59:30

Re: Verketten mehrerer Befehle in einem Aufruf

Beitrag von MSfree » 08.10.2018 16:06:02

Code: Alles auswählen

find /tmp -name messages.\* -exec grep -H SuchString {} \;
Alle Leerzeichen hier sind wichtig!

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Verketten mehrerer Befehle in einem Aufruf

Beitrag von uname » 08.10.2018 16:45:12

Statt (ls ...) suchst du $(ls ...). Ob es hilft weiß ich nicht.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Verketten mehrerer Befehle in einem Aufruf

Beitrag von tobo » 08.10.2018 16:50:44

kochi09 hat geschrieben: ↑ zum Beitrag ↑
08.10.2018 15:57:38
Mein Versuch war, mittels runder Klammern einzusetzen
Runde Klammern eröffnen eine Subshell - was du willst ist die Ausgabe dieser Befehlskette als neues Argument $() und gequotet, falls Leerzeichen vorhanden sind:

Code: Alles auswählen

tail -f "$(ls -S /tmp/*messages* | tail -1)" | grep for.srv
Wobei das Weiterverarbeiten einer ls-Ausgabe in Sonderfällen problematisch sein kann!?

kochi09
Beiträge: 2
Registriert: 19.04.2017 14:57:31

Re: Verketten mehrerer Befehle in einem Aufruf

Beitrag von kochi09 » 10.10.2018 13:15:25

Da mit der Ausgabe der Befehlskette als neues Argument $() hatte ich versucht. Ohne Anführungszeichen und mit einfachen Hochkommata. Da kam immer die Fehlermeldung
tail: $(ls | grep messages | tail -1) kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden

Mit normalen Anführungszeichen hat es jetzt auch bei mir geklappt :-) Manchmal sind es die Kleinigkeiten, die einem das Brett vor den Kopf nageln :-D
tail -f "$(ls | grep messages | tail -1)" | grep .srv

Besten Dank!!!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Verketten mehrerer Befehle in einem Aufruf

Beitrag von ThorstenS » 10.10.2018 13:19:13

Ich bin ein großer Fan von Debianmultitail, weil es Suchergebnisse hübsch hervorheben kann und auch mehrere Dateien im Blick haben kann:

Code: Alles auswählen

multitail -e ".srv" $(…)
Ausserdem fällt mir auf, dass du mit -S nach der Größe sortierst, aber du möchtest doch die zuletzt veränderte message Datei finden. Daher ist ls -ltr vllt. besser geeignet.

Antworten