CSS for code highlight

26 февраля 2023

Курс валют ЦБ РФ в командной строке (однострочник)

Было навеяно вопросом на Хабр Q&A, были предложены решения с использованием дополнительных утилит xq, yq, jq. Стало интересно решить полностью на awk

У ЦБ РФ есть официальная страница по получению данных в XML - Получение данных, используя XML , собственно страница с нужным XML https://www.cbr.ru/scripts/XML_daily.asp

Итак, curl вытягиваем данные, затем awk-ом парсим. Немного погуглив разобрался с awk, получилось следующее:

curl -s https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null

или wget вместо curl

wget -qO-  https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null

-F '</Valute>' - разбиваем на "записи" - колонки, в принципе достаточно разбить на "записи" по слову Valute
В цикле пробегаемся по записям-колонкам, при совпадении строки с шаблоном выводим из этой строки подстроки, в которых имеется наименование валюты и курс
2>/dev/null - подавляем вывод варнинга, "(FILENAME=- FNR=1) warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale.", либо предварительно файл необходимо конвертировать с помощью iconv к локальной кодировке.

PS: еще один сервис по получению данных в JSON виде:
https://www.cbr-xml-daily.ru/daily_json.js

Было интересно и я немного развлекся...:

на Perl

perl -MLWP::Simple -e '$_=get("https://www.cbr.ru/scripts/XML_daily.asp");print "$1 $2\n" while(m/(USD|EUR).+?Value>([^<]+)/g)'

на Python

python3 -c 'import requests,re;print("\n".join([" ".join(i.groups()) for i in list(re.finditer(r"(USD|EUR).+?Value>([^<]+)", requests.get("https://www.cbr.ru/scripts/XML_daily.asp").text))]))'

на PowerShell

# вариант 1 (RegEx)
(Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content | Select-String '(USD|EUR).+?Value>([^<]+)' -AllMatches | foreach {$_.Matches.Groups[1,2,4,5].Value}
# вариант 2 (XML/XPath)
([xml](Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content).SelectNodes('//Valute[CharCode="USD" or CharCode="EUR"]') | ft Name,Value

UPDATED 2023-05-20
Вспомнил про JavaScript ))) Но сервер сценариев Windows (WSH) не выполняет скрипты непосредственно в командной строке и это хорошо, есть же Node.js, который к тому же и гораздо распространеннее (в смысле установить его можно на любую платформу - Win, Mac, Linux).

на JavaScript (Node.js)

регулярными выражениями разбираем XML:

node -e "https.get('https://www.cbr.ru/scripts/XML_daily.asp',r=>{s='';r.on('data',d=>s+=d);r.on('end',()=>[...s.matchAll(/(USD|EUR).+?Value>([^<]+)/g)].forEach(e=>console.log(`${e[1]} ${e[2]}`)))})"

JSON

node -e "https.get('https://www.cbr-xml-daily.ru/daily_json.js',r=>{s='';r.on('data',d=>s+=d);r.on('end',()=>{v=(JSON.parse(s)).Valute;console.log(`USD ${v.USD.Value}\nEUR ${v.EUR.Value}`)})})"

PS: имхо, лаконичнее всего на Perl, ну может быть еще на PowerShell, хоть и длинновато, а вы как считаете? ))
Эх, Perl, давно забытый всеми язык...

Ссылки по awk:
[1] ЯЗЫК ОБРАБОТКИ ШАБЛОНОВ awk
[2] Хабр - Bash-скрипты, часть 8: язык обработки данных awk
[3] zaLinux.ru - Уроки по Awk
[4] The GNU Awk User’s Guide

Комментариев нет:

Отправить комментарий

Последнее...

CURL вместо Postman / Swagger