Ich habe zwei Protokolldateien, denen ein sortierbarer Zeitsatz vorangestellt ist. Ich möchte sie in der Reihenfolge sehen, während die Prozesse, die die Protokolldateien generieren, noch ausgeführt werden. Dies ist eine ziemlich getreue Simulation der Situation:sortierte Dateien mit minimaler Pufferung zusammenführen
slow() {
# print stdout at 30bps
exec pv -qL 30
}
timestamp() {
# prefix stdin with a sortable timestamp
exec tai64n
}
# Simulate two slowly-running batch jobs:
seq 000 099 | slow | timestamp > seq.1 &
seq1=$!
seq 100 199 | slow | timestamp > seq.2 &
seq2=$!
# I'd like to see the combined output of those two logs, in timestamp-sorted order
try1() {
# this shows me the output as soon as it's available,
# but it's badly interleaved and not necessarily in order
tail -f seq.1 --pid=$seq1 &
tail -f seq.2 --pid=$seq2 &
}
try2() {
# this gives the correct output,
# but outputs nothing till both jobs have stopped
sort -sm <(tail -f seq.1 --pid=$seq1) <(tail -f seq.2 --pid=$seq2)
}
try2
wait
Ah, du hast schon bemerkt "nichts, bis beide Jobs aufgehört haben", was für mich richtig klingt. Wenn Sie Daten wie "y, x, w, a, b, c, z" haben, müssen Sie alles lesen, um die richtige Reihenfolge zu erhalten. Für sehr nahe Daten, wie Ihre Zeitstempel sind, könnten Sie ein Pufferungssystem erstellen, aber yikes! Tolles Q übrigens! Viel Glück! – shellter
Es sollte sicherlich möglich sein, in "Chunks" zu puffern, so dass Sie nahezu sortierte Log-Ausgaben in Echtzeit erhalten (Ausgabe-Logs pro Minute oder so), aber Sie müssen ein Fenster dafür auswählen, und Ihre Logs würden ablegen in großen Mengen. –
Die beiden Streams sind bereits sortiert, so dass ein System nur den Puffer pro Zeile benötigt. An diesem Punkt kann es den kleineren der beiden drucken und trotzdem eine gut sortierte Ausgabe garantieren. Ich kann das sicherlich in Python schreiben, aber ich hatte auf ein bereits erfundenes Dienstprogramm gehofft. Ich denke eigentlich, 'sort -m' sollte so funktionieren ... – bukzor