Seu principal problema é esta linha
cat $filename | grep {1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\} \r"
Além do uso inútil de cat , o erro principal é que {1,3}
significa " jogo 1,2 ou 3 "vezes, mas o seu não dizendo o que para combinar. A sintaxe também está errada, {}
precisa ser escapado para grep
regular. O que você está procurando é melhor escrito como:
grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' filename
Isso usa a sintaxe PCRE ( -P
), em que \d
significa "dígitos" e que eu acho mais fácil, mas para usar as expressões regulares padrão grep
(BREs) que você pode fazer:
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
-
O
-o
faz com quegrep
imprima apenas a parte correspondente da linha. -
Você nunca quer combinar o caractere de fim de linha, não há necessidade. Você deve sempre tentar tornar suas expressões regulares o mais simples possível. É sempre melhor usar a menor e mais simples expressão que corresponda aos seus dados.
-
Você certamente não deseja pesquisar por
\r
. Embora o Windows finalize linhas com\r\n
, a maioria dos sistemas não o faz e, em qualquer caso, não faz sentido procurar por ele. Se você precisar corresponder ao final de uma linha, use$
, que funcionará em todos os casos.
De qualquer forma, para salvar em uma variável, faça isso:
ip=$(grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' filename)
Agora você pode ecoar $ip
para imprimir o IP.
Com base na sua última edição, estou assumindo que você deseja o ip definido pela tag ipAddress. Agora, darei o aviso obrigatório: NUNCA use expressões regulares para analisar o XML ou formatos semelhantes. Dito isto, para obter apenas o ipAddress IP, faça o seguinte:
ip=$(grep -Po 'ip_v4="\K[0-9.]+' $filename)
O \K
descarta o que foi correspondido antes para obter apenas a parte IP e, como você sabe que o IP que está procurando é sempre precedido por ip_v4="
, você pode simplesmente procurar a string mais longa que contém apenas números e .
.