web-dev-qa-db-fra.com

Simple BASH - comment lire le fichier ligne par ligne

J'ai un fichier qui a les éléments suivants:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9

Le premier nombre est le nombre de fois où l'IP de droite a essayé de se connecter à ma machine (ssh) à partir du même réseau. L'objectif est de bloquer cette adresse IP à l'aide de netfilter si la tentative est supérieure à 3. Ici, 2 entrées correspondent aux critères. Remarque: Il peut y avoir plus de 3 entrées.

Je n'arrive pas à trouver un moyen de trier ce fichier ligne par ligne (je suis très novice chez BASH). Voici ce que j'ai essayé:

#!/bin/bash
file="/home/foo/documents/iptxt"
while IFS='' read line || [[ -n "$line" ]]; do
  char1=`awk '{ print $1 }' $file`
  char2=`awk '{ print $2 }' $file`
  if $char1 -gt 3
  then
    echo "$char2 has tried to login $char1 times
  fi
done <$file

Cela donne une erreur "commande introuvable" pointant vers la 5ème ligne (si déclaration). Pas étonnant, car j'ai répété $ char1_attempt et cela donne:

6 13 2
6 13 2
6 13 2

Pour le moment, je veux juste qu'il imprime des lignes comme:

192.168.0.4 has tried to login 6 times
192.168.0.2 has tried to login 13 times
192.168.0.1 has tried to login 2 times

S'il vous plaît aider!

1
DivZ

Je recommanderais de commencer comme ça:

#!/bin/bash
file="/home/foo/documents/iptxt"

while read num addr ; do 
    if [[ "$num" && "$addr" ]] ; then 
        echo "$addr has tried to log in $num times" 
    fi
done < "$file"

De cette façon, read stocke le premier mot de chaque ligne dans $num et le reste de la ligne dans $addr, qui ne doit être que l'adresse IP. Ensuite, dans la boucle while, nous vérifions si les deux ne sont pas vides et, dans ce cas, imprimons le message.

5
Byte Commander