J'ai un fichier journal qui ressemble à ceci:
grep -oE 'match1|match2' /log.txt
Maintenant, je veux extraire toutes les adresses IP et les chaînes de date / heure au début en utilisant grep. Je sais déjà comment obtenir les ips:
May 25 05:34:16 192.0.2.1
et les dates / heures:
grep -o '[A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' /log.txt
mais je ne le fais pas savoir comment obtenir les deux en même temps dans un format comme:
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /log.txt
J'ai lu quelque chose comme:
May 25 05:34:16 server sshd[1203]: Received disconnect from 192.0.2.2 port 39102:11 May 25 05:34:16 server sshd[1203]: Disconnected from 192.0.2.1 port 39102
mais cela ne semble pas fonctionner.
3 Réponses :
Imprimer deux correspondances sur une seule ligne est plus facile avec awk
, la date suivante imprimera (en imprimant $ 1, $ 2, $ 3
et toute l ' adresse IP valide .
gawk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/,a);split(a[0],b,".")} b[1]<=255&& b[2]<=255 && b[3]<=255 && b[4]<=255 &&length(a[0]){print $1,$2,$3, a[0]}' log_file May 25 05:34:16 192.0.2.2 May 25 05:34:16 192.0.2.1
Explication: Utilisez d'abord la fonction de correspondance pour capturer toutes les chaînes au format digit.digit.digit.digit code > et stockez-les dans un tableau appelé "
a
", puis divisez le tableau capturé ( a
) par des caractères point (.
) et vérifiez si chacun est 255 pour garantir que l'adresse IP est valide.
Notez que: GNU awk est utilisé ici.
Notez également que l'expression régulière que vous avez mentionnée affichera également les adresses IP invalides (par exemple: 333.222.555.666
).
Existe-t-il un moyen de trier également les lignes par ips? Donc, les mêmes ips seraient dans un "groupe"?
Comment pourrais-je compter le nombre d'occurrences d'une adresse IP et les répertorier par la plupart des occurrences?
Ceci est une nouvelle exigence, pouvez-vous s'il vous plaît poster une nouvelle question avec l'exigence mise à jour?
également, veuillez ajouter l'entrée fournie et la sortie attendue
Vous pouvez utiliser vos 2 modèles dans un groupe de capture et utiliser ceux du remplacement en utilisant sed:
May 25 05:34:16 192.0.2.2 May 25 05:34:16 192.0.2.1
Cela correspondra:
^
Début de chaîne ([AZ] [az] [az] [0-3] [0-9] [0-9] [0-9]: [0-9] [0-9]: [0 -9] [0-9])
Votre date / heure comme modèle . *
Correspond à n'importe quel caractère 0 fois et plus ([0-9] {1,3} \. [0-9] {1,3} \. [0-9] {1,3} \. [0-9] {1 , 3})
L'espace de correspondance a suivi votre modèle de type IP . *
Correspond à n'importe quel caractère 0 fois et plus $
Fin de chaîne Résultat
sed -i -E 's#^([A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]).* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*$#\1 \2#g' log.txt
Avec n'importe quel awk dans n'importe quel shell sur n'importe quelle boîte UNIX:
$ awk '{print $1, $2, $3, $(NF-2)}' file May 25 05:34:16 192.0.2.2 May 25 05:34:16 192.0.2.1