Duplizieren von Zeilen aus einem Stream

926
cpa

Ich analysiere derzeit Apache-Protokolle mit diesem Befehl:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400 |  grep specific.stuff. | awk '' | cut -d/ -f3 > ~/logs 

Die Ausgabe ist eine Liste von Domänen:

www.domain1.com www.domain1.com www.domain2.com www.domain3.com www.domain1.com 

In einem anderen Terminal führe ich dann diesen Befehl aus:

watch -n 10 'cat ~/logs | sort | uniq -c | sort -n | tail -50' 

Die Ausgabe ist:

1023 www.domain2.com 2001 www.domain3.com 12393 www.domain1.com 

Ich verwende dies, um quasi Echtzeit-Apache-Statistiken zu überwachen. Das Problem ist, dass logssehr schnell sehr groß werden. Ich brauche keine Protokolle für andere Zwecke als uniq -c.

Meine Frage ist: Gibt es eine Möglichkeit, die Verwendung einer temporären Datei zu vermeiden? Ich möchte meine eigene Theke nicht in meiner bevorzugten Sprache rollen, ich möchte, awkwenn möglich, etwas Magie einsetzen.

Beachten Sie, dass ich, da ich verwenden sortmuss, eine temporäre Datei verwenden muss, da das Sortieren nach Streams bedeutungslos ist (obwohl uniq dies nicht ist).

2

1 Antwort auf die Frage

0
MelBurslan

Obwohl es vielleicht das Offensichtliche zeigt, haben Sie Folgendes versucht:

tail -f /opt/apache/logs/access/gvh-access_log.1365638400 | grep specific.stuff. | awk '' | cut -d/ -f3 | sort | uniq | sort -n | tail -50 

Ich weiß, dass es eine lange Befehlszeile ist, aber die Erstellung der Zwischendatei entfällt. Wenn dies für Sie nicht funktioniert, können Sie uns bitte den Grund nennen, damit Sie aussagekräftigere Antworten erhalten.

Es funktioniert nicht, weil es bedeutungslos ist, sort in einem Stream zu verwenden. Deshalb brauche ich eine temporäre Datei. cpa vor 11 Jahren 1
Hast du es versucht und gesehen, dass es bei dir nicht funktioniert hat oder du einfach nur davon ausgegangen bist, dass es nicht funktioniert? Die Erstellung der temporären Datei ist dasselbe, als würden Sie die Ausgabe Ihres ersten Befehls an den zweiten Befehl als Eingabe übergeben. Wenn Sie es noch nicht versucht haben, probieren Sie es einfach aus. Wenn Sie es versucht haben, auf welches Problem sind Sie gestoßen? MelBurslan vor 11 Jahren 0
Es gibt mehrere Gründe, warum dies nicht funktioniert (und ich habe es versucht): - `sort` wartet auf EOF, bevor es seine Ausgabe schreibt. Ich hoffe es ist offensichtlich warum. - `tail -50` nimmt die letzten 50 Zeilen von EOF auf. Am Ende läuft es also darauf hinaus, dass 'tail -f' in einem Apache-Log niemals EOF ausgeben wird, da ständig Zeilen an die Datei angehängt werden. Durch das Ablegen von Ergebnissen in eine Datei können Sie dies erreichen. Sicher, ich könnte einfach "Schwanz" machen, aber es erfordert immer noch eine Analyse der Protokolldatei, was dumm ist. cpa vor 11 Jahren 1