Forum Programmation.shell Isoler une chaine de caractère et compter son nombre d'occurrences

Posté par  . Licence CC By‑SA.
Étiquettes :
1
4
juin
2014

Hello,

Je cherche un moyen d'extraire d'une capture de mon trafic DNS certains sites et d'en afficher le nombre d’occurrence.

Le fichier que je récupère est sous ce format :

14:15:37.837411 IP 109.215.228.235.23582 > 81.253.149.2.53: 25335+ A? b.fc.namequery.com. (36)
14:15:37.837930 IP 80.10.202.65.30568 > 209.53.113.4.53: 59709 [1au] A? b.fc.namequery.com. (47)
14:15:44.746399 IP 109.215.90.49.1024 > 81.253.149.2.53: 7376+ A? search.namequery.com. (38)
14:15:49.456342 IP 82.121.161.41.1024 > 81.253.149.1.53: 26292+ A? search.namequery.com. (38)
14:15:49.456865 IP 80.10.202.103.3499 > 209.53.113.6.53: 27871 [1au] A? search.namequery.com. (49)
14:15:53.477188 IP 90.21.150.38.1024 > 81.253.149.6.53: 30830+ A? search.namequery.com. (38)

Je souhaiterai donc avoir en final :

b.fc.namequery.com. 2
search.namequery.com. 4
xxx.search.namequery.com. 42
etc…

Je suppose que je dois utiliser |sort|uniq -c pour le nombre d’occurrence et les additionner ?
Mais pour isoler seulement le FQDN, je ne sais pas trop quoi utiliser sed, awk ou autre ?

Merci d'avance pour votre aide

Cordialement,

  • # awk

    Posté par  . Évalué à 3.

    Bonjour,

    awk est ton ami:
    awk '{a[$(NF-1)]++} END{for (i in a) print i,a[i]}' fichier.txt | sort -k 2 -n

    Cordialement

    • [^] # Re: awk

      Posté par  . Évalué à 3. Dernière modification le 04 juin 2014 à 12:52.

      Pourquoi le sort ? Et pourquoi $NF-1 ? As-tu testé ?

      Ah, ça y est, je crois avoir compris le problème : dans mon fichier, je n'ai pas les valeurs entre ().

      Question pour le PI : Doit-on additionner les valeurs entre parenthèses ?

      • [^] # Re: awk

        Posté par  . Évalué à 4. Dernière modification le 04 juin 2014 à 12:59.

        NF-1 car effectivement le DNS est dans l'avant dernier champs.
        Le sort, car son résultat était trié sur le nombre d’occurrence.
        Et il ne faut pas additionner, car sinon le résultat pour b.fc.namequery.com devrait être 36+47 et non 2

        et oui, j'ai testé sur son exemple :-)

  • # Tu peux tout faire avec awk.

    Posté par  . Évalué à 5. Dernière modification le 04 juin 2014 à 12:53.

    awk '{tab[$NF-1]+=1} END { for (i in tab) { print i ":" tab[i]}}' <chemin_fichier>
    
  • # Vite fait

    Posté par  (site web personnel) . Évalué à 2.

    Ça devrait le faire…

    awk '! /^[[:space:]]*$/ {print $(NF-1)}' ton_fichier | sort -f |uniq -c

  • # Merci

    Posté par  . Évalué à 2.

    Merci bien messieurs, c'est exactement ce qu'il me fallait.

    Toujours un plaisir de venir ici :)

    Have a nice day

  • # cut et sort, uniq

    Posté par  . Évalué à 4.

    cut -d '?' -f2
    pour recuperer la 2e partie apres le '?'

    | sort -k 1
    pour trier sur la premiere colonne (le FQDN)

    | cut -d' ' -f1
    pour ne recuperer que le FQDN

    | uniq -c
    pour les compter

    | awk '{print $2" "$1}'
    pour inverser le FQDN et le total (uniq met le total à gauche)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.