Mon objectif est d'extraire les adresses IP uniquement et d'annoncer à un nouveau fichier. Le fichier que j'ai s'appelle error_log.txt et contient des lignes telles que:
[Sun Jun 7 16:45:56 2020] [Info] [Client 64.242.88.10] (104) Réinitialisation de la connexion par Peer: Client arrêté la connexion avant d'envoyer le corps terminé p> blockQuote>
[Sun Jun 7 17:13:50 2020] [Info] [Client 64.242.88.10] (104) Connexion Réinitialiser par Peer: Client arrêté la connexion avant d'envoyer le corps terminé P> blockquote>
L'objectif est d'écrire "64.242.88.10" et le reste de l'IPS à un nouveau fichier à un nouveau fichier. p>
Je peux obtenir la fonction d'impression pour me donner uniquement les IPS, mais quand Il écrit au fichier 'ip_only.txt' IT imprime la ligne complète à partir du journal d'erreur. P>
Comment puis-je simplement obtenir les IP uniquement au nouveau fichier (dans une colonne)? P> Bonus, quand il imprime lorsque vous testez, cela me donne aussi les lignes vides. Comment puis-je omettre ces lignes? P>
import re with open('error_log.txt', 'r') as file: fi = file.readlines() ip_only = open('ip_only.txt', 'w+') re_ip = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") for line in fi: ip = re.findall(re_ip, line) ip_only.write(str(line)) # print(ip)
3 Réponses :
Vous devez écrire la variable code> ip code> au fichier au lieu de Ligne code> qui contient la ligne d'origine: for line in fi:
ips = re.findall(re_ip, line)
for ip in ips:
ip_only.write(ip + '\n')
# ip_only.txt:
# 64.242.88.10
# 64.242.88.10
Ce changement de code crée un fichier vierge, mais n'écrire aucune ligne maintenant.
C'est étrange, je l'ai testé dans mon environnement local avec les lignes de journal d'erreur que vous avez fournies et cela fonctionne pour moi.
en écrivant dans un fichier, vous écrivez toute la ligne. Écrivez plutôt que les IPS comme ci-dessous
Pour éviter les lignes vides, vous pouvez avoir une condition IF pour vérifier, que l'IP soit trouvée ou non dans la ligne donnée. P>
li>
IP_ONLY.WRITE (STR (IP)) CODE> P>
li>
si Regex donne une liste afin que vous puissiez peut-être écrire uniquement comme pour la ligne vide - d'abord supprimer tous les espaces, onglets, entre et Commencez ensuite avec String vide impression (IP) code> vous donne un résultat attendu, vous devez utiliser écrire (IP) code> au lieu de écrire (ligne) code> IP [0] code>. Et vous devez ajouter \ n code> pour passer à la ligne suivante. P> "" code>. Ou utilisez le fait que la chaîne vide donne false code> lorsqu'il est utilisé dans si / else code> p>
Pourquoi êtes-vous
écrire (ligne) code> si vous avez besoinécrire (IP) code>?Pour ignorer les chaînes vides
si ip.strip ()! = "": code> ou plus courtsinon ip.strip (): code>