Dateinamen am Anfang jeder Zeile anzeigen, wenn mehrere Dateien gleichzeitig abgehakt werden?

14

Gibt es eine Möglichkeit, den Dateinamen am Anfang jeder Zeile anzuzeigen, wenn Sie wie unten gezeigt mehrere Dateien gleichzeitig verfolgen?

tail -f one.log two.log

aktueller Output

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

Suchen Sie nach etwas wie

one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...
mtk
quelle
Sie können sich die -v(ausführliche) Option für tail ansehen . Dies entspricht möglicherweise nicht genau Ihrer Frage, ist aber ein Anfang.
Rahul
multitail kann dies tun , ich denke
Gilles ‚SO- Anschlag, die bösen‘

Antworten:

7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ Dankeschön {don_cristti}

Joao
quelle
@don_crissti, danke! (1) eine vs Datei - kein Wein mehr in mein Glas! (2) gute Idee. Ich fange an, so etwas zu tun, aber ich sagte mir lasziv: "Niemand wird aus Dateien mit Leerzeichen einen Schwanz machen" :) - Ich werde Ihre hervorragenden Vorschläge verwenden.
Joao
Kannst du Länge 8 erklären? warum es hier 8 ist, kenne ich nur 8 werke.
Shicheng Guo
1
tail -n 1 * .txt | awk '/ ^ ==> / {a = substr ($ 0, 5, Länge-8); next} {print a, $ 1} '| awk '$ 2> 0 {if ($ 2! ~ / chrY /) print $ 1}' | xargs -I {} qsub {}
Shicheng Guo
@ ShichengGuo, 8 = Länge ("==>") + Länge ("<==")
JJoao
1
überraschend / erstaunlicherweise funktioniert deine joojoo magic awklösung!
Trevor Boyd Smith
6

Kurze Antwort

GNU Parallel hat eine Reihe netter Optionen, die es wirklich einfach machen, solche Dinge zu tun:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

Die Ausgabe wäre:

one.log: Inhalte von one.log hier ...
one.log: Inhalte von one.log hier ...
two.log: Inhalt von two.log hier ...
two.log: Inhalt von two.log hier ...

Weitere Erklärung

  • Die Option --tagstring=strmarkiert jede Ausgabezeile mit string str . Aus der parallel Manpage :
--tagstring str
                Markieren Sie Zeilen mit einer Zeichenfolge. Jede Ausgabezeile wird mit vorangestellt
                str und TAB (\ t). str kann Ersetzungszeichenfolgen wie {} enthalten.

                --tagstring wird ignoriert, wenn -u, --onall und --nonall verwendet werden.
  • Alle Vorkommen von {}werden durch die Argumente von parallel ersetzt, die in diesem Fall Protokolldateinamen sind. dh one.logund two.log(alle Argumente danach :::).

  • Diese Option --line-bufferist erforderlich, da die Ausgabe eines Befehls (z. B. tail -f one.logoder tail -f two.log) gedruckt wird, wenn dieser Befehl beendet ist. Da tail -fauf das Wachstum der Dateien gewartet wird, ist es erforderlich, die Ausgabe online zu drucken --line-buffer. Nochmals von der parallel Manpage :

--Line-Buffer (Alpha-Test)
                Pufferausgabe auf Zeilenbasis. --group behält die Ausgabe bei
                zusammen für einen ganzen Job. --ungroup ermöglicht das Verwechseln der Ausgabe mit
                eine halbe Zeile von einem Job und eine halbe Zeile von
                andere Arbeit. --Line-Buffer passt zwischen diese beiden: GNU parallel
                druckt eine ganze Zeile, erlaubt aber das Mischen von Zeilen mit
                Verschiedene jobs.
Karikaturist
quelle
2

Wenn dies tailnicht obligatorisch ist, können Sie grepdazu Folgendes verwenden:

grep "" *.log

Dies gibt den Dateinamen als Präfix jeder Ausgabezeile aus.

Die Ausgabe wird unterbrochen, wenn *.lognur eine Datei angezeigt wird. In dieser Hinsicht:

grep '' /dev/null *.log
serenesat
quelle
Ich muss den Dateinamen in der Ausgabe von tail -fnicht anzeigen grep.
MTK
@serenesat würde dies nur den gesamten Inhalt der Dateien drucken, nicht wahr? Das OP verlangte, dass der Dateiname gedruckt wird, wenn der Schwanz angegeben wird
rahul
Sie können auch einfach --with-filenameoder -Himmer das Voranstellen von Dateinamen erzwingen.
Trevor Boyd Smith
Ich liebe diese Antwort wirklich! genau das, was bei einer Lösung mit einer Länge von 13 Zeichen benötigt wird. im Gegensatz zu kniffligen awkLösung oder paralleldie nicht installiert ist.
Trevor Boyd Smith
Das einzige Problem ist, dass Ihre Protokolldateien 1 Million Zeilen lang sind. dann wird Ihr grep 1 Million Zeilen zur Konsole (oder über SSH) Spam ...
Trevor Boyd Smith
0

Meine Idee wäre, eine einzelne Datei mit zusammengeführten Protokollen aus mehreren Dateien zu erstellen, wie hier vorgeschlagen , und Dateinamen voranzustellen:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG
Arkadiusz Drabczyk
quelle
0

Etwas mit xargsund sedkönnte funktionieren:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
FloHimself
quelle