LINUX.ORG.RU

Обработка переменной

 


0

1

Всем привет!

есть переменная вида:

ResPF=$(/usr/sbin/pflogsumm {.... список параметров ....} /var/log/mail.log 2>/dev/null

Но при работе с ней выясняется, что вывод ее передается в одну строку, и нужные параметры оттуда я не могу грепнуть.

Как это обойти? Есть ли какой-то параметр, который мог бы позволить сохранить ту переменную не как строку, а как вывод результата со всеми переносами и пробелами?

Такой вывод получается обрабатывать грепом:

Postfix log summaries for Oct  2

Grand Totals
------------
messages

      2   received
      1   delivered
      0   forwarded
      0   deferred
      2   bounced
      0   rejected (0%)
      0   reject warnings
      0   held
      0   discarded (0%)

   3386   bytes received
    863   bytes delivered
      1   senders
      1   sending hosts/domains
      1   recipients
      1   recipient hosts/domains

А такой уже нет:

 Postfix log summaries for Oct 2 Grand Totals ------------ messages 2 received 1 delivered 0 forwarded 0 deferred 2 bounced 0 rejected '(0%)' 0 reject warnings 0 held 0 discarded '(0%)' 3386 bytes received 863 bytes delivered 1 senders 1 sending hosts/domains 1 recipients 1 recipient hosts/domains 



Последнее исправление: Aborigen1020 (всего исправлений: 1)

Есть ли какой-то параметр, который мог бы позволить сохранить ту переменную не как строку, а как вывод результата со всеми переносами и пробелами?

Конечно. Можно просто сохранить вывод в файл

/usr/sbin/pflogsumm {.... список параметров ....} /var/log/mail.log 2>/dev/null > /tmp/mypflogsumm.txt
grep ... /tmp/mypflogsumm.txt

Если греп нужен только один раз, то проще сразу /usr/sbin/pflogsumm .... | grep ...

Вариант с ResPF="$(...)" будет работать, но в баше естественнее работа с файлами.

legolegs ★★★★★
()
Ответ на: комментарий от anonymous
ResPF="$(/usr/sbin/pflogsumm {.... список параметров ....} /var/log/mail.log 2>/dev/null)"

BYTES_RN=$(echo "$ResPF" | grep "bytes received"  | tr -d \ [a-z])

echo $BYTES_RN

test@test: 863

Бинго. Спасибо.

Aborigen1020
() автор топика
Ответ на: комментарий от legolegs

Спасибо за совет. Раньше скрипт и работал с файлами.

Решил поковорыться и уйти от тонны временных файлов, немного разобраться и переделать.

Aborigen1020
() автор топика
Ответ на: комментарий от legolegs

Нет-нет, в том случае, если содержимое $ResPF грепается несколько раз по разным параметрам, например: received, delivered, и т.д.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Мне кажется наилучшим такое решение:

while read -r v k; do
  case $k in
    "bytes received") BYTES_RN=$v;;
    "bytes delivered") BYTES_DN=$v;;
  esac
done < <(/usr/sbin/pflogsumm ...)

Оно не вызывает по нескольку процессов на каждую величину, не читает файлы целиком в память и не плодит временные файлы.

Можно скастовать коллегу vodz и попросить сделать решение на переменных.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Спасибо! Что-то такое мне он и подсказывал, но я пока не разобрался.

Aborigen1020
() автор топика
Ответ на: комментарий от legolegs

Оно не вызывает по нескольку процессов на каждую величину, не читает файлы целиком в память и не плодит временные файлы.
Можно скастовать коллегу vodz и попросить сделать решение на переменных.

Да хорошо написано. Если уж делать задачу по уму, то надо править перловку pflogsumm для работы без никакого вторичного парсера. Ведь не «оптимизировать» же, а добавить фичи — новые опции вывода с ручным заданием формата для вставки в отчёт.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.