1
votes

Comment utiliser grep pour extraire les adresses IP et les chaînes de date / heure du fichier journal?

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.


0 commentaires

3 Réponses :


0
votes

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).


4 commentaires

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



0
votes

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


0 commentaires

0
votes

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


0 commentaires