Simple BASH - como ler o arquivo linha por linha

0

Eu tenho um arquivo com o seguinte:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9

O primeiro número é o número de vezes que o IP da direita tentou fazer login na minha máquina (ssh) na mesma rede. O objetivo é bloquear esse IP usando o netfilter se a tentativa for maior que 3. Aqui, duas das entradas correspondem aos critérios. Nota: Pode haver mais de 3 entradas.

Não consigo descobrir uma maneira de classificar esse arquivo linha por linha (sou muito novo no BASH). Aqui está o que eu tentei:

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

Isto dá um erro "comando não encontrado" apontando para a 5ª linha (se for uma instrução). Não admira, porque eu ecoou $ char1_attempt e dá:

6 13 2
6 13 2
6 13 2

Por enquanto, J só quer imprimir linhas como:

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

Por favor me ajude!

    
por DivZ 01.03.2018 / 00:15

1 resposta

4

Eu recomendaria começar assim:

#!/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"

Dessa forma, read armazena a primeira palavra de cada linha em $num e o restante da linha em $addr , que deve ser apenas o endereço IP. Em seguida, dentro do loop while, verificamos se ambos não estão vazios e, se for esse o caso, imprima a mensagem.

    
por Byte Commander 01.03.2018 / 00:53