Você quase acertou na primeira vez. A resposta awk
é boa para o seu caso específico, mas o motivo pelo qual você recebeu um erro é porque estava tentando usar grep
como se estivesse procurando um arquivo em vez de uma variável.
Além disso, ao usar expressões regulares, sempre uso grep -E
apenas para estar seguro. Também ouvi dizer que os backticks estão obsoletos e devem ser substituídos por $()
.
A maneira correta de grep
de uma variável com shells compatíveis com herestrings está sendo usada redirecionamento de entrada com 3 desses caras: <
, então seu comando grep
( $ip
variable) deve realmente ler da seguinte maneira:
ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
Se for um arquivo que você está pesquisando, eu sempre uso um while
loop, já que é garantido que ele vai linha por linha, enquanto for
loops frequentemente são descartados se houver algum espaçamento estranho. Você também está implementando um uso inútil de cat
, que também pode ser substituído pelo redirecionamento de entrada. Tente isto:
while read line; do
ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
echo "$ip"
done < "abd"
Além disso, não sei qual SO ou versão de grep
você está usando, mas o caractere de escape que você tinha antes das chaves geralmente não é necessário sempre que eu usei esse comando no passado. Pode ser usando grep -E
ou porque eu uso entre aspas e sem backticks - não sei. Você pode experimentar com ou sem e ver o que acontece.
Se você usa um loop for
ou while
, isso é baseado em qual deles funciona para você em sua situação específica e se o tempo de execução é de extrema importância. Não me parece que OP esteja tentando atribuir variáveis separadas a cada endereço IP, mas que ele queira atribuir uma variável a cada endereço IP dentro da linha, para que possa usá-la dentro do próprio loop - em que caso ele precise apenas de uma única variável $ip
por iteração. Eu estou aderindo às minhas armas em um presente.