if expr ".$IP_ADDRESS" : '\(\.[0-9]\{1,3\}\)\{3,4\}$' > /dev/null
then echo match
else echo no match
fi
Você não pode usar grep
aqui porque grep
é usado para corresponder linhas, não seqüências de caracteres. Você não pode usar echo
como substituições em seus argumentos. Você não pode deixar as variáveis sem aspas, como ocorre na geração de nomes de arquivos e na divisão de palavras.
Se você quiser encontrar as linhas que correspondem a esse padrão em um arquivo de entrada, é aí que você deseja usar grep
. Como:
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}' < input.file
Informaria todas as linhas que consistem exatamente ( -x
option) em um número decimal de 3 ou 4 até 3 dígitos.
Se você deseja extrair todos os 3 ou 4 endereços IP de números decimais de até três dígitos em um arquivo de texto, provavelmente a melhor opção seria recorrer a perl
:
perl -lne 'print for grep /^\d{1,3}(\.\d{1,3}){2,3}$/, /[\d.]+/g'
A saída seria:
111.222.333
1.2.3.4
Para uma entrada como:
foo 1.1234.2.3 1.2 1.2.3.4.5 111.222.333 bar1.2.3.4@
Embora você também possa fazer:
tr -cs 0-9. '[\n*]' < input.file |
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}'