Zliczanie powiela linie ze strumienia

2

Obecnie analizuję dzienniki apache za pomocą tego polecenia:

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

Dane wyjściowe to lista domen:

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

W innym terminalu uruchamiam to polecenie:

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

Dane wyjściowe to:

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

Używam tego do monitorowania statystyk apache w czasie rzeczywistym. Problem polega na tym logs bardzo szybko się bardzo duże. Nie potrzebuję dzienników w żadnym innym celu niż uniq -c.

Moje pytanie brzmi: czy jest jakiś sposób na uniknięcie używania pliku tymczasowego? Nie chcę ręcznie zapisywać własnego licznika w wybranym języku, chciałbym użyć niektórych awk magia, jeśli to możliwe.

Zauważ, że odkąd muszę użyć sort, Muszę użyć pliku tymczasowego w tym procesie, ponieważ sortowanie strumieni jest bez znaczenia (chociaż nie jest to uniq).

cpa
źródło

Odpowiedzi:

0

Chociaż może wskazywać na to, co oczywiste, ale czy próbowałeś tego:

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

Wiem, że jest to długi wiersz poleceń, ale eliminuje tworzenie pliku pośredniczącego. Jeśli to nie działa dla ciebie, czy możesz powiedzieć dlaczego, aby uzyskać bardziej sensowne odpowiedzi.

MelBurslan
źródło
1
Nie działa, ponieważ nie ma sensu używać sortowania w strumieniu, dlatego potrzebuję pliku tymczasowego w tym procesie.
cpa
Czy próbowałeś i zobaczyłeś, że to nie działa dla ciebie lub tylko zakładasz, że to nie zadziała? Utworzenie pliku tymczasowego jest tym samym, co potokowanie wyjścia pierwszego polecenia do drugiego polecenia jako jego wejścia. Jeśli nie próbowałeś, po prostu spróbuj. Jeśli próbowałeś, jaki problem napotkałeś?
MelBurslan
1
Istnieje kilka powodów, dla których to nie działa (i próbowałem): - sort czeka na EOF przed zapisaniem wyjścia. Mam nadzieję, że to oczywiste, dlaczego. - tail -50 pobiera ostatnie 50 linii z EOF. W końcu oznacza to, że tail -f w dzienniku apache nigdy nie wyjdzie EOF, ponieważ stale dołącza linie do pliku. Zrzucanie wyników w pliku to sposób na osiągnięcie tego. Jasne, mogłem po prostu tail ale nadal wymaga parsowania pliku dziennika za każdym razem, co jest głupie.
cpa