match string dans awk


1

Comment puis-je rechercher dans le fichier les lignes qui ont SRC =, par exemple ici? je veux dire, comment puis-je trouver l'adresse IP source dans ce fichier en utilisant awk par exemple

Mar 10 03:17:12 ubuntu kernel: [11045.721649] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.28 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=47 ID=6603 PROTO=TCP SPT=47301 DPT=53 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:12 ubuntu kernel: [11045.721702] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.30 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=42 ID=6802 PROTO=TCP SPT=47301 DPT=5900 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:32 ubuntu kernel: [11065.703937] Type=ScanACKIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.31 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=40 ID=62992 PROTO=TCP SPT=47301 DPT=1521 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:32 ubuntu kernel: [11065.706729] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.32 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=47 ID=15170 PROTO=TCP SPT=47301 DPT=14442 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0

et puis j'aimerais obtenir cette sortie:

192.168.1.28
192.168.1.30
192.168.1.31
192.168.1.32

Il y a beaucoup de lignes (100 000) et je veux rechercher SRC = et puis quand je trouve des lignes rogner SRC = et trouver juste l'adresse IP

UTILISER AWK

Merci à tous! :)


Des ça doit être awk ou sera gawk être d'accord?
terdon

awk est préféré mais pas impuissant du tout
Arash

awk '(/SRC=192.168.1.28/) {print $ 11}' mais je veux juste une adresse IP
Arash

Il suffit de demander parce que vous pouvez capturer des matchs en gawk avec match().
terdon

Réponses:


4

Malheureusement, awk ne capture pas ses groupes. Vous voudrez peut-être chercher un outil plus moderne pour écrire des lignes simples, telles que Perl.

Cela dit, le moyen le plus rapide de le faire dépend dans votre cas si SRC = est toujours au même endroit dans les journaux.

Si c'est toujours au même endroit et que les arguments contiennent toujours le même nombre de signes égaux, vous pouvez simplement diviser vos lignes à la fois sur égal et espace et prendre le 15ème champ:

awk -F'[= ]' '{print $15}'

Sinon, pour une approche plus robuste, vous pouvez remplacer la partie qui mène à SRC = et la partie qui la suit:

awk '{sub(/.* SRC=/, ""); sub(/ .*/, ""); print;}'

Si vous devez compter les occurrences, vous pouvez ajouter un message idiomatique. | sort | uniq -c | sort -rn dans le pipeline, mais c’est inefficace avec 100 000 lignes. Il vaut mieux utiliser le type de dictionnaire intégré de awk pour les deux premières étapes:

awk '{sub(/.* SRC=/, ""); sub(/ .*/, ""); ips[$0]++;}
     END {for (ip in ips) printf("%8d  %s\n", ips[ip], ip);}' | sort -nr

La sortie de l'un ou l'autre devrait ressembler à ceci:

7513  192.168.1.28
 330  192.168.1.30
 103  192.168.1.31
  19  192.168.1.32

cela fonctionne.merci u: *: D mais 1 question, comment puis-je savoir que si 1 ip apparaissait 3 fois l’échangent dans le fichier en nouvelle ligne.
Arash

Je ne comprends pas cette dernière question
Tobia

3

Bien que cela soit certainement possible avec awk, c'est beaucoup plus simple avec grep:

grep -Po "(?<=SRC=)[\d.]+"

Comment ça marche:

  • -P permet Expressions régulières compatibles avec Perl .

  • -o affiche uniquement la partie correspondante de la ligne.

  • (?<=SRC=) est une assertion de regard positive, c’est-à-dire que le match doit être précédé de SRC = .

  • [\d.]+ est un nombre quelconque de chiffres et de points.


2

Une solution sed (sed est aussi standard que awk dans les systèmes UNIX):

sed -n -e 's/.*SRC=\([^ ]*\).*/\1/p' -e 's/.*SRC=\([^ ]*\)$/\1/p' file

Ce qu’il fait, c’est essayer d’enlever tout avant un SRC= et après l'espace suivant. Quand une substitution est faite, imprimez la ligne résultante. La deuxième substitution est nécessaire si l'adresse IP est le dernier champ de la ligne.


2

Je ferais ça avec awk:

awk -F '[ =]' '{for (i=1; i<NF; i++) if ($i == "SRC") {print $(i+1); next}}'

2

Ce pur awk fonctionne même si le nombre de champs change, tant que l'adresse IP souhaitée est précédée de SRC= et suivi d'un espace:

awk -F'SRC=' '{print $2}' a | awk '{print $1}'

Cela pourrait être plus simple avec gawk qui a le match() fonction qui vous permet de capturer des motifs:

gawk 'match($0,/SRC=([0-9.]+)/,k){print k[1]}' a

1

Encore un autre awk pour essayer que jette les lignes qui ne contient pas SRC=:

awk -F'.*SRC=| ' '/SRC=/{print $2}' file

Ou essayer un autre sed:

sed -n '/.*SRC=/{s///; s/ .*//p;}' file
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.