web-dev-qa-db-fra.com

Comment vérifier si une adresse IP est présente dans un fichier à l'aide de scripts Shell?

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.

14
Koshur

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.

29
Ijaz Ahmad Khan

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
2
Valentin Bajrami

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

2
Ganapathy

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

2
Bryan Ritter

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.

0
chutz
ip -4  addr show eth1 |  grep -oP '(?<=inet\s)\d+(\.\d+){3}'
0
Smit Jain

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>
0
Keyshov Borate

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.

0
eyez

Voici la forme courte

grep -oE "\b(\d{1,3}\.){3}\d{1,3}\b"

\ d est pour les chiffres [0-9]

0
k_vishwanath