J'ai un script qui génère une sortie. Je veux vérifier cette sortie pour toute adresse IP comme
159.143.23.12
134.12.178.131
124.143.12.132
if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //
fgrep
est-il une bonne idée?
J'ai bash disponible.
Oui, vous avez beaucoup d'options/outils à utiliser. Je viens d'essayer ça, ça marche:
ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
vous pouvez donc utiliser grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
pour récupérer les adresses IP de votre sortie.
Si votre fichier est appelé par exemple ips
vous pouvez écrire quelque chose comme:
while read -r ip
do
if [[ $ip == "$1" ]]; then
shift
printf '%s\n' 'action to take if match found'
else
printf '%s\n' 'action to take if match not found'
fi
done < ips
Ensuite, vous pouvez passer les paramètres en suivant le script
./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132
Testé dans SmartOS (une variante de Solaris), nous espérons qu'il devrait fonctionner dans d'autres environnements * nix:
egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
Exemple:
$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411
$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1
Ce modèle ne correspond qu'à IPv4 valide , c'est-à-dire x.x.x.x
Où x
va de 0 à 255. Si vous devez extraire uniquement l'IP correspondante, ajoutez une option -o
À la commande ci-dessus. Vous pouvez intégrer cette commande dans un script bash et probablement dans d'autres scripts Shell également. Et, si egrep
échoue, try grep -E ...
L'utiliser dans un script Shell (bash):
ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip
commencer ma réponse sur la base de cette réponse:
Oui, vous avez beaucoup d'options/outils à utiliser. Je viens d'essayer ça, ça marche:
ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3}\b" a afin que vous puissiez utiliser grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3}\b "pour récupérer les adresses IP de votre sortie.
et convertir la réponse en IPv6 complet, etc ...:
fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file
si vous voulez garder le/nnn s'il est là:
fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file
et il y a aussi la version abrégée d'IPv6 qui inclut '::'.
pour plus de réponses IPv6, vous pouvez consulter ici: https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
Si vous avez la liste des adresses IP dans un fichier, une par ligne, grep
a déjà le _ -f
option:
$ man fgrep | grep file= -A1
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.)
Cela peut provoquer quelques faux positifs en raison de chaînes éventuellement suivies d'un autre nombre pour en faire une IP différente. Beaucoup de choses que vous pouvez faire à ce sujet, selon votre cas, vous pouvez ou non décider de vous inquiéter.
ip -4 addr show eth1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Redirige cette sortie vers un outputFile
Simplement grep
avec le motif as,
grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
Je pense que ma réponse à un autre post est mieux adaptée ici. Grâce à ce post et à d'autres similaires, j'ai trouvé ceci, qui recherche le format IP correct, puis se débarrasse de toutes les lignes qui contiennent 256 ou plus. Remplacez l'IP par quelque chose qui n'est pas valide pour ne voir aucune sortie à la place:
echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'
Le premier grep a probablement été trouvé dans cet article et il vérifie les nombres de 0 à 999 au format X.X.X.X
Le deuxième grep supprime les lignes avec les numéros 256-999, ne laissant ainsi que des adresses IP de format valides, donc j'ai pensé
MAIS ... Comme l'a souligné G-Man, j'étais dans l'erreur en supposant que l'IP serait sur sa propre ligne. Le plus souvent cependant, il y aura un espace ou un autre diviseur à rechercher de chaque côté de l'IP. Les espaces/séparateurs peuvent être supprimés avec sed ou d'autres moyens une fois l'adresse IP trouvée. J'ai également ajouté -o au premier grep:
echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.100 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
Le premier et le second ne donneront aucune sortie, tandis que le troisième le fera et les espaces seront supprimés.
Voici la forme courte
grep -oE "\b(\d{1,3}\.){3}\d{1,3}\b"
\ d est pour les chiffres [0-9]