Gibt es ein Tool, das einen Eingabestream top-ify kann?

7

Ich stoße auf einige Anwendungsfälle, in denen es sehr nützlich wäre, Eingaben aus einem (normalerweise durch Zeilenumbrüche getrennten) Stream zu nehmen und sie topartig zusammenzufassen (siehe oben, iotop usw.). Eine Art On-the-Fly-Pivot-Tisch.

zB Nehmen Sie die logarithmische Eingabe:

I heard A from unit 1 and it said "Great!" 56
I heard A from unit 2 and it said "Oh no!" 42
I heard C from unit 1 and it said "Waiting for input." 33
I heard B from unit 3 and it said "Stopped." -1
...

Daraus könnten wir ein Tool mit einem regulären Ausdruck und Gruppenindikatoren ausführen:

topify [lineout] [regex] [name #1] [group #1] [name #2] [group #2] [All other columns name position]
     where:
         lineout is the number of lines before removing it from the display
         regex is a regex of the lines to match, complete with group indicators
         name #n is a string for the title of column n
         group #n is the number of the group in the regex

z.B

topify '/^I heard ([A-Z]) from unit ([1-9]) and it said "(.*)" ([-0-9]*)$/' Unit 2 Status 1 Message 3 RetVal 4

Dies würde auf interaktive Weise angezeigt, so dass die Spalten ausgewählt / neu angeordnet werden könnten usw.:

Unit Status Message            Retval
1    C      Waiting for input. 33
2    A      Oh no!             42
3    B      Stopped.           -1

Ich verstehe die Sprödigkeit davon, aber ich wäre wirklich überrascht, wenn es nicht vorher gebaut worden wäre und es überprüfen wollte, bevor ich es baue. Ich schätze auch, dass das Schreiben nicht besonders kompliziert ist. Vielleicht hat jeder gerade seine eigene Lösung implementiert ...

Hat jemand ein solches Tool gesehen?

(Bitte entschuldigen Sie die Tags, die ich hier verwendet habe. Ich weiß, dass ich möglicherweise gegen die Regeln einiger Tags verstoße, aber dies ist sehr verallgemeinert. Vorschläge sind willkommen.)

tu-Reinstate Monica-dor duh
quelle
Das ist wirklich etwas, das du selbst schreiben solltest ... das nächste, woran ich denken kann, ist der watchBefehl.
MikeyB
Das war auch mein erster Gedanke, aber watch gruppiert keine Dinge oder filtert nicht mit Smarts. Ich habe überlegt, eine Kombination aus awk / watch / shell zu verwenden, aber es ist ein Schritt komplexer.
Tu-Reinstate Monica-dor duh
Ich denke, das awkist der richtige Weg ... mit einem verschlüsselten Array.
Floris

Antworten:

1

Sie müssen kein Tool schreiben, das Standard-Unix-Toolset bietet Platz für Sie.

#!/bin/bash
echo -e 'Unit\tStatus\tMessage\t\t\tRetval'
cat /var/log/filename | awk '{match($0,"\".*\"",a)}{print $6 "\t" $3 "\t" a[0] "\t\t" $NF}' |sort -k<fieldnum>

Legen Sie das in eine .sh-Datei und führen Sie watch darauf aus.

Aaron Tate
quelle
1
Ich denke, Sie haben gerade ein Tool geschrieben.
Michael Hampton
Gute Mühe, aber ich denke, Sie haben ein paar Kriterien übersehen "(siehe oben / iotop usw.) ... on-the-fly ... auf interaktive Weise, sodass die Spalten ausgewählt / neu angeordnet werden können ..." Es ist möglich, dass Sie den Befehl neu schreiben, dies ist jedoch nicht sehr flexibel, sobald Sie das Skript starten, und Sie könnten dadurch Informationen verpassen.
Tu-Reinstate Monica-dor duh
Fair genug, es entspricht nicht den Kriterien, aber wenn Sie wissen, dass Sie es selbst schreiben möchten, schauen Sie sich die Entwicklungsbibliotheken von ncurses an. Abgesehen davon bin ich mir ziemlich sicher, dass Sie nichts finden werden um Ihre genauen Anforderungen zu erfüllen.
Aaron Tate