Estou fora da programação há mais de 10 anos. Eu tenho um arquivo de texto que estou tentando ler o valor de Mpbs para velocidade de upload e download.
Server: Iomart - Maidenhead (id = 3839)
ISP: Plusnet
Latency: 8.59 ms (0.10 ms jitter)
Download: 71.43 Mbps (data used: 52.8 MB)
Upload: 18.39 Mbps (data used: 16.9 MB)
Packet Loss: 0.0%
Tenho usado uma ferramenta regex para testar e construir minha regex, que entrega o resultado que desejo.
regex2="Upload:\W+([0-9]+\.[0-9]+)"
regex3="Download:\W+([0-9]+\.[0-9]+)"
while read line; do
if [[ $line =~ regex2 ]]
then
echo "match ${BASH_REMATCH[1]}"
UPS=${BASH_REMATCH[1]}
fi
if [[ $line =~ regex3 ]]
then
echo "match ${BASH_REMATCH[1]}"
DNS=${BASH_REMATCH[1]}
fi
done < Result.txt
Tenho certeza de que deve haver uma maneira melhor de conseguir o que desejo, mas o principal problema que estou tendo é que o regex não funciona.
Responder1
Você tem três problemas em seu código.
- Você não está usando as expressões regulares que pensa que está (faltando
$
eregex2
)regex3
. bash
não entende a expressão regular semelhante ao Perl\W
como "não é um caractere de palavra".- Você não está lendo linhas (mesmo que sua variável seja chamada
line
).
Para resolver isso:
Use
$
on para obter os valores deregex2
eregex3
nos testes:if [[ $line =~ $regex2 ]]; then ...; fi
Use a expressão regular POSIX
[^[:alnum:]_]
no lugar de\W
nas expressões ou[[:blank:]]
que corresponda a uma tabulação ou espaço.Usar
while IFS= read -r line; do ...; done
(veja "Compreendendo "IFS = read -r line"").