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

13

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 //

C'est fgrepune bonne idée?

J'ai bash disponible.

Koshur
la source
utilisez grep, egrep, awk ou sed, comme vous
voulez
Pourriez-vous aider avec la syntaxe s'il vous plaît? Je veux dire comment recherche-t-il une IP aléatoire. Comment décrire le motif? Je chercherais n'importe quelle adresse IP, pas une adresse particulière.
Koshur
5
S'agit-il uniquement d'adresses IPv4 en notation quadri-décimale? Pourraient-ils être écrits comme ça 0010.0000.0000.0001? Le fichier peut-il autrement contenir des éléments qui ressemblent à des adresses IP comme des numéros de version ( soft-1.2.1100.1.tar.gz, spécifications réseau (10.0.0.0/24), 1.2.3.4.5)? Accepteriez-vous une solution positive au 333.444.555.666? Ou 0377.0377.0377.0377(une adresse IP quad-octale valide)?
Stéphane Chazelas
Si bashest disponible, alors il l' awkest généralement aussi, donc cela pourrait fonctionner pour vous: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(Ce one-liner traduit la sortie de la liste XFR hôte au /etc/hostsformat.)
Mark Hudson

Réponses:

25

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"

afin que vous puissiez utiliser grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"pour grep les adresses IP de votre sortie.

Ijaz Ahmad Khan
la source
Merci. Cela marche. Pouvez-vous expliquer un peu? Est-ce une expression régulière?
Koshur
Oui, c'est une expression régulière utilisée en bash avec grep, vous recherchez juste un motif à trois chiffres séparés par des points. vous pouvez jouer avec en changeant les nombres dans {1,2} pour 2 chiffres consécutifs et ainsi de suite
Ijaz Ahmad Khan
On peut également utiliser "\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"pour trouver des CIDR (en supposant qu'ils sont valides)
vikas027
2

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: /programming/53497/regular-expression-that-matches-valid-ipv6-addresses

Bryan Ritter
la source
fgrepest l'ancien nom d'une variante grepqui ignore la correspondance de motifs. Je vous recommande d' utiliser grep(ou même egrep) à la place, d' autant plus que vous êtes bien vouloir pattern matching.
roaima
2

Si votre fichier est appelé, par exemple, ipsvous 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
Valentin Bajrami
la source
1

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.xoù la xplage va de 0 à 255. Si vous devez extraire uniquement l'IP correspondante, ajoutez une -ooption à la commande ci-dessus. Vous pouvez intégrer cette commande dans un script bash et probablement dans d'autres scripts shell également. Et, en cas d' egrepéchec,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

Ganapathy
la source
Cela a bien fonctionné sur un système CentOS 6, grep 2.6.3
David Ramirez Il y a
0

Si vous avez la liste des adresses IP dans un fichier, une par ligne, a grepdéjà l' -foption pratique :

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

chutz
la source
0

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 cherche 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 XXXX

Le deuxième grep supprime les lignes avec les numéros 256-999, ne laissant ainsi que des adresses IP de format valides, donc je

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.

eyez
la source
Supposons que j'ai 500 adresses, allant de 10.0.0.1 à 10.0.1.244. Votre deuxième grepjetterait cette ligne à cause du «500». (La question n'a jamais dit que les adresses IP dans le fichier, le cas échéant, seraient sur une ligne par elles-mêmes.) En revanche, il acceptera 1234.1.1.1 et 1.1.1.1234. Mais à part ça, pas mal.
G-Man dit `` Réintègre Monica '' le
-1

Rediriger cette sortie vers certains outputFile

Simplement grepavec un motif comme,

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
Keyshov Borate
la source
4
Notez que .c'est un opérateur d'expression régulière et qu'il faut s'échapper pour qu'il soit traité littéralement
Stéphane Chazelas
1
Ce ne sont pas des modèles, ce sont des littéraux. Pas une réponse utile car l'OP spécifiait "toute IP".
Mark Hudson
-1
ip -4  addr show eth1 |  grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Smit Jain
la source