Determinare il numero di righe uniche con awk o simili in bash

Sto utilizzando AWK per leggere un file di registro personalizzato che ho. Il formato è qualcosa di simile:

[12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.4:8091 HTTP/1.0" 200 

Adesso, ho AWK (da bash) impostato per leggere tutto il log, analizzare each row e afferrare each row che contiene "CONNECT" che funziona, tuttavia, non mi aiuta a scoprire i clienti unici.

  • Come posso monitorare la width di banda per utente su Linux?
  • Come faccio a fornire un accesso utente a / var / www / html?
  • Scelta del filesystem distribuito per letture e scritture intensive
  • Massimizzazione delle connessioni TCP sull'equilibratore di carico HAProxy
  • Password non scadente sul server Linux
  • Conte il numero di byte provenienti da un process all'altro
  • Il modo per farlo sarebbe quello di filtrare in qualche modo in modo da analizzare questa parte di each row: "CONNECT 192.168.2.4:8091 HTTP / 1.0"

    Se c'era un modo per afferrare tutte quelle righe in un file di registro, quindi confrontarle tutte e conteggiare solo linee simili. Diciamo per esempio:

      [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.6:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.9:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.2:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.9:8091 HTTP/2.0" 200 

    In questo caso, la risposta che avrei bisogno sarebbe 3, non 4. Poiché 2 righe sono le stesse, quindi ci sono solo 3 righe uniche. Quello che mi serve è un modo automatizzato per realizzare questo con AWK.

    Se qualcuno può prestare una mano che sarebbe grande.

    3 Solutions collect form web for “Determinare il numero di righe uniche con awk o simili in bash”

    Potresti lasciare ad awk contare istanze uniche come questa:

     awk -F\" '/CONNECT/ && !seen[$2] { seen[$2]++ } END { print length(seen) }' logfile 

    Produzione:

     3 

    Questo raccoglie la prima string double citata dalle righe contenenti CONNECT nell'arrays hash seen . Quando viene raggiunta la fine dell'ingresso, viene printingto il numero di elementi in seen .

    sed -re 's/.*"([^"]*)".*/\1/' <logfile> |sort |uniq

    Awk variante: awk -F'"' {print $2} <logfile> |sort |uniq

    Aggiungere -c a uniq per get un count di ciascuna linea corrispondente, oppure |wc -l per get un count del numero di righe corrispondenti.

    Eseguire il file di registro attraverso il sorting. | uniq dovrebbe filtrare le linee duplicate, ma chiederei perché hai quelle righe lì. Sono davvero duplicati?

    Se sono legittime voci di registro e tutto quello che vuoi è un elenco univoco di client (il secondo field) per linee che non sono duplicati, quindi una semplice modifica dello script di Thor dovrebbe farti quello che vuoi:

     awk ' /CONNECT/ { if (seen[$0] == 0) { clients[$3]++ } seen[$0]++ } END { for (i in clients) { print i } }' 

    Quale per il campione che hai fornito i risultati in:

     192.168.2.3 

    Questo non è così compatto come lo script di Thor, ma di solito ritengo che non appena ho scritto qualcosa di simile, voglio fare di più con le righe stesse, quindi ho lasciato l'arrays visto (tracciando il count di unica linee) in esso.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.