Lorsqu'on lui a demandé de faire correspondre une adresse IP, beaucoup écrire
/\d+\.\d+\.\d+\.\d+/
mais cela donnera des faux positifs. Dans Mastering Regular Expressions de Jeffrey Friedl, l'auteur donne un modèle pour les adresses IP correspondantes qui est beaucoup plus prudent. Le code ci-dessous emprunte à Friedl pour forcer non une exécution arbitraire de chiffres mais sur la plage de 0 à 255, nécessite qu'une adresse commence et se termine aux limites de mot (\b
), et n'autorise pas l'adresse 0.0.0.0.
Sans argument, le code ci-dessous par défaut le répertoire en cours pour le début de sa recherche. Pour rechercher tous les fichiers, fournissez le répertoire racine en tant qu'argument. En ouvrant chaque chemin généré par find
, nous recherchons ensuite une adresse IP sur chaque ligne et imprimons tous les hits avec leurs chemins respectifs.
Notez comment le code utilise local
pour basculer de manière transparente entre le caractère NUL et la nouvelle ligne pour le séparateur d'enregistrement $/
. Ceci est nécessaire parce que l'action de find
sépare les noms de fichiers avec '\0'
, mais '\n'
est le terminateur de ligne. Avec -T
, nous recherchons uniquement des fichiers texte.
#! /usr/bin/perl
use warnings;
no warnings 'exec';
use strict;
my $octet = qr/[01]?\d\d?|2[0-4]\d|25[0-5]/;
my $ip = qr/ \b
(?!0+\.0+\.0+\.0+\b)
$octet(?:\.$octet){3}
\b
/x;
@ARGV = (".") unless @ARGV;
open my $find, "-|", "find", @ARGV, "-type", "f", "-print0"
or die "$0: failed to start find: $!\n";
$/ = "\0";
while (defined(my $path = <$find>)) {
chomp $path;
next unless -T $path;
if (open my $fh, "<", $path) {
local $/ = "\n";
while (<$fh>) {
print "$path: $_" if /$ip/;
}
close $fh;
}
else {
warn "$0: open $path: $!\n";
}
}
Encore une fois, c'est un problème pour SuperUser. – Johnsyweb
@Johnsyweb La [FAQ] (http://stackoverflow.com/faq) indique que SU est pour «Dépannage général de logiciels ou de matériel informatique». Il s'agit d'une question de programmation, pas d'une question de dépannage. –
Je suis assis corrigé. Bien que la raison de la question ne soit pas mentionnée, il semble s'agir de résoudre un problème de réseau ou de sécurité. Depuis que vous l'avez résolu avec un programme Perl, il est clairement à la maison sur SO. – Johnsyweb