46. Índices econômicos no terminal

Ás vezes a gente quer consultar alguma cotação, seja dólar, euro, ouro etc, e então abrimos o navegador e pesquisamos no Google. Por que não no terminal? Comecei a pensar num meio de buscar essas informações num site e imprimi-las na tela. Consegui, usando wget
, sed
, grep
, head
, tail
e outras. Vou compartilhar o que consegui e dar umas dicas de como acrescentar outros índices.
A Mágica

No exemplo acima, eu instalei o meu script shell (a seguir) na pasta ~/.local/bin
, mas exclui a extensão do arquivo (.sh
), para poder digitar apenas indices
em qualquer local, sem ter que digitar a localização do script.
Copie esse script do meu GitHub Gist e faça o mesmo:
#!/bin/bash | |
# | |
# indices.sh - version 1.5 - 08/01/2025 | |
# Copyright (c) 2024, 2025 Daniel Dias Rodrigues <danieldiasr@gmail.com>. No | |
# rights reserved. | |
# | |
# This program is free software; you can redistribute it and/or modify it | |
# under the terms of the Creative Commons Zero 1.0 Universal (CC0 1.0) Public | |
# Domain Dedication (https://creativecommons.org/publicdomain/zero/1.0/). | |
# | |
URL_DOLAR="http://www.yahii.com.br/dolardiario" | |
URL_EURO="http://www.yahii.com.br/eurodiario" | |
URL_OURO="https://pt.bullion-rates.com/gold/BRL-history.htm" | |
URL_BTC="https://www.infomoney.com.br/cotacoes/cripto/ativo/bitcoin-btc" | |
URL_DOLAR_REALTIME="https://www.xe.com/currencyconverter/convert/?Amount=1&From=USD&To=BRL" | |
URL_EURO_REALTIME="https://www.xe.com/currencyconverter/convert/?Amount=1&From=EUR&To=BRL" | |
_validContent(){ | |
local CONTENT="$(wget -qO- $1$(date +%y).html)" | |
local CURRENT="" | |
local COUNT=0 | |
while [ -z "$CURRENT" ]; do | |
COUNT=$(($COUNT + 1)) | |
DATE=$(date --date="$(date +%F) -$COUNT day" +%x) | |
YEAR=$(echo "$DATE" | cut -c 7-10) # Extrai os 4 primeiros caracteres do ano | |
if [ "$YEAR" -eq "$(($(date +%Y) - 1))" ]; then | |
CONTENT="$(wget -qO- $1$(($(date +%y)-1)).html)" | |
fi | |
CURRENT=$(echo "$CONTENT" | grep "$DATE" -A2) | |
done | |
if [ -z "$DATE" ]; then | |
DATE=$(date +%x) | |
fi | |
COIN=$(echo "$CURRENT" | tail -2 | sed 's/ //g' | sed 's/<.*=2>//g' | sed 's/<.*//g') | |
COINc=$(echo "$COIN" | head -1) | |
COINv=$(echo "$COIN" | tail -1) | |
echo "$DATE $COINc $COINv" | |
} | |
USD=$(_validContent "$URL_DOLAR") | |
USD_DATE=$(echo "$USD" | cut -d' ' -f1) | |
USD_BUY=$(echo "$USD" | cut -d' ' -f2) | |
USD_SELL=$(echo "$USD" | cut -d' ' -f3) | |
EURO=$(_validContent "$URL_EURO") | |
EURO_DATE=$(echo "$EURO" | cut -d' ' -f1) | |
EURO_BUY=$(echo "$EURO" | cut -d' ' -f2) | |
EURO_SELL=$(echo "$EURO" | cut -d' ' -f3) | |
GOLD_CONTENT="$(wget -qO- $URL_OURO)" | |
GOLD_CURRENT="$(echo "$GOLD_CONTENT" | grep "$(date +%d/%m/%y)" -A2)" | |
while [ -z "$GOLD_CURRENT" ]; do | |
COUNT=$(($COUNT + 1)) | |
GOLD_DATE=$(date --date="$(date +%F) -$COUNT day" +%d/%m/%y) | |
GOLD_CURRENT=$(echo "$GOLD_CONTENT" | grep "$GOLD_DATE" -A2) | |
done | |
if [ -z "$GOLD_DATE" ]; then | |
GOLD_DATE=$(date +%x) | |
else | |
GOLD_DATE=$(echo "$GOLD_DATE" | sed -r 's/(.{6})/\120/') | |
fi | |
GOLD_clear=$(echo "$GOLD_CURRENT" | tail -2 | sed -e 's/ //g' -e 's/<.*\">//g' -e 's/<.*//g') | |
GOLDg=$(echo "$GOLD_clear" | head -1) | |
GOLDoz=$(echo "$GOLD_clear" | tail -1) | |
# Current values | |
btc_section=$(wget -qO- "$URL_BTC" | rg -A21 'Atualizado' | tr -s ' ' | tr '\n' ' ') | |
btc=$(echo $btc_section | sed -r -e 's/.*<div class="value">([^div]*)<\/div>.*/\1/g' -e 's/[^[:digit:],\.]//g') | |
usd=$(wget -qO- "$URL_DOLAR_REALTIME" | grep "1.00 US Dollar =" \ | |
| sed -re "s/.*1.00 US Dollar =(.{70}).*/\1/g" -e 's/<[^>]*>?//g' -e 's/\./,/') | |
eur=$(wget -qO- "$URL_EURO_REALTIME" | grep "1.00 Euro =" \ | |
| sed -re "s/.*1.00 Euro =(.{70}).*/\1/g" -e 's/<[^>]*>?//g' -e 's/\./,/') | |
echo "Valores históricos | |
================== | |
Dólar comercial¹ | Euro¹ | Ouro² | |
(${USD_DATE}) | (${EURO_DATE}) | (${GOLD_DATE}) | |
Compra R$ ${USD_BUY} | Compra R$ ${EURO_BUY} | R$ ${GOLDg}/g | |
Venda R$ ${USD_SELL} | Venda R$ ${EURO_SELL} | R$ ${GOLDoz},00/oz | |
Valores correntes | |
================= | |
1,00 USD³ = R$ ${usd} | |
1,00 EUR³ = R$ ${eur} | |
1,00 BTC⁴ = R$ ${btc} | |
Fontes: | |
¹ yahii.com.br/Indices.html | |
² pt.bullion-rates.com/gold/BRL-history.htm | |
³ xe.com | |
⁴ infomoney.com.br/cotacoes/cripto/ativo/bitcoin-btc" |
O Truque
O truque é mais fácil do que parece. Basicamente usamos o comando wget
para baixar uma página html
que contenha a cotação desejada, mas jogando o resultado numa variável em vez de um arquivo. Depois é só ir fazendo o tratamento com as demais ferramentas: sed
, grep
, head
, tail
e outras.
Por exemplo, o site www.xe.com mostra cotações em tempo real. Felizemente ele não usa muito javascript, a cotação está arquivada na própria página. Se não estivesse, não adiantaria baixar.
$ wget -qO- "https://www.url.com/sua-cotação.html"
Opções usadas: -q, --quiet silencioso (não emite nada) -O, --output-document=ARQUIVO escreve para o ARQUIVO - traço simples é o local stdout, standard output
Ou seja, -qO-
manda "baixar de forma silenciosa, sem escrever nada na tela, e salvar o documento baixado na saída padrão". Isso nos permite salvar a página numa variável para uso posterior, ou usar o pipe "|
" e passar o resultado para um segundo comando, como o grep
ou o sed
, que farão a filtragem do conteúdo.
Nesse ponto, conhecimento básico de expressões regulares (regex, de regular expressions) é fundamental. Aprendi muito com o livro do A. M. Jargas:
JARGAS, Aurélio Marinho. Expressões regulares: uma abordagem divertida. 4 ed. rev. e ampl. São Paulo: Novatec, 2012.
Comentários
Postar um comentário