Acho que entendi o que você está tentando realizar:
- Para cada hit no site, que é registrado pelo servidor da web:
- Se a visita for "única" (como você define isso ??) registre a entrada e envie uma notificação audível.
O truque é como você define "exclusivo". É por URL, por endereço IP, por cookie?
Sua abordagem com o awk foi, sem dúvida, o caminho certo a seguir, mas você foi preso por regras que escapam da concha.
Então, aqui está algo que combina suas abordagens. Primeiro, você realmente precisa de um script no servidor da Web para fazer isso. Caso contrário, você se perderá em regras complexas de escape de cotações. Segundo, estou assumindo que o seu servidor web está usando o "formato common-log", que, francamente, é uma droga para esse tipo de trabalho, mas podemos trabalhar com ele.
while true; do
ssh root@speedy remote-log-capturing-script
done > unique-visits.log
Use a excelente sugestão do mikeserv sobre o MAILFILE. O script no speedy deve ficar assim:
#!/bin/sh
tail -1f /var/log/apache2/www.access.log |
awk '$(NF-1) == 200' |
grep --line-buffered -o '"GET [^"]*"' |
awk '!url[$1]{ print; url[$1]=1 }'
Awk é sempre com buffer de linha. O primeiro awk garante que você está obtendo apenas hits reais bem-sucedidos, não em cache ou 404s. O grep -o imprime apenas a parte correspondente da entrada, neste caso, o URL. (Este é o grep do GNU, que eu suponho que você esteja usando. Se não, use o truque stdbuf.) O próximo awk usa uma pequena expressão para imprimir condicionalmente a linha de entrada - somente se essa linha de entrada nunca tivesse sido vista antes.
Você também pode fazer isso com o perl para obter mais complexidade em um fork:
#!/bin/sh
tail -1f /var/log/apache2/www.access.log |
perl -lane '$|=1;' \
-e 'if ($F[$#F-1] eq "200" and ' \
-e ' /\s"GET\s([^"]*)"\s/ and !$url{$1}) { '\
-e ' print $1;$url{$1}=undef; }'
Agora, os dois só imprimirão URLs únicos. E se dois clientes da web de diferentes IPs atingissem a mesma página? Você só recebe uma saída. Para mudar isso, com as soluções perl, isso é fácil: modifique a chave que vai para o url.
$url{$F[0],$1}
Ao usar perl -a, $ F [0] representa o primeiro campo de entrada delimitado por espaços em branco, assim como o $ 1 de awk - isto é, o nome de host / endereço de conexão. E o $ 1 de perl representa a primeira subexpressão correspondente da expressão regular /\s"GET\s([^"]*)"\s/
, ou seja, apenas a própria URL. O enigmático $F[$#F-1]
significa o segundo ao último campo da linha de entrada.