Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Linux

Извлечение подстроки в bash встроенными средствами

19.06.2021 12:54


19.05.2021 12:30
OlegON
 
В большинстве случаев, когда пишут скрипты, пользуются sed или awk, забывая, что это самые настоящие отдельные программки, запуск которых кушает ресурсы, что на обработке длинных текстов вполне себе ощутимо даже на современных машинках. Да и зачем вообще электричество лишний раз жечь :)
На примере обработки статистики unbound, где выдается длинная лопата вида
Цитата:
total.num.queries=46626
total.num.queries_ip_ratelimited=0
total.num.cachehits=38639
total.num.cachemiss=7987
total.num.prefetch=3955
total.num.expired=0
total.num.recursivereplies=7987
total.requestlist.avg=0.843326
total.requestlist.max=40
total.requestlist.overwritten=0
total.requestlist.exceeded=0
total.requestlist.current.all=0
total.requestlist.current.user=0
total.recursion.time.avg=0.489479
total.recursion.time.median=0.0832953
total.tcpusage=0
time.now=1621414829.591092
time.up=746889.425198
time.elapsed=1.196692
во-первых, не хочется на получение каждого параметра запускать unbound-control отдельно, тем более, что параметры быстро меняются, а во-вторых, не хочется на каждую строку запускать даже cut
Если длина выделяемой подстроки фиксированная - делаем так:
Код:
nm=${line:10:5}
это обозначает, что с 0 отсчитываем 10 символов и берем строку в 5 длиной. Но мне нужно другое, как видно, делаем так:
Код:
${line%=*}
то есть берем подстроку до символа "=", а потом
Код:
${line#*=}
берем от = и до конца строки
Код:
while read line;
do
nm=${line%=*}
if [[ $nm = "total.num.queries" ]]
then
TOTAL=${line#*=}
fi
done < <(unbound-control stats)
echo $TOTAL

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.