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! :)
awk
ou seragawk
être d'accord?match()
.Réponses:
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:
Sinon, pour une approche plus robuste, vous pouvez remplacer la partie qui mène à SRC = et la partie qui la suit:
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:La sortie de l'un ou l'autre devrait ressembler à ceci:
la source
Bien que cela soit certainement possible avec awk, c'est beaucoup plus simple avec grep:
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.la source
Une solution sed (sed est aussi standard que awk dans les systèmes UNIX):
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.la source
Je ferais ça avec awk:
la source
Ce pur
awk
fonctionne même si le nombre de champs change, tant que l'adresse IP souhaitée est précédée deSRC=
et suivi d'un espace:Cela pourrait être plus simple avec
gawk
qui a lematch()
fonction qui vous permet de capturer des motifs:la source
Encore un autre
awk
pour essayer que jette les lignes qui ne contient pasSRC=
:Ou essayer un autre
sed
:la source