Bash. Как прочитать лог файл в переменную после перенаправления «динамического вывода» &> file.log?

Здравствуйте.
Цель: в bash скрипте выполнить внешнюю команду и записать вывод и ошибки в переменную, но без динамических изменений (проценты, скорость).
Вариант через
OUTPUT=`megacmd sync /tmp/site/ mega:/backup/latest/ 2>&1`

megacmd sync /tmp/site/ mega:/backup/latest/ > log.txt 2>&1
OUTPUT=`cat log.txt`

получается с динамическими строчками (смотреть пример вывода ниже КОД-2) как в переменной, так и в файле.

Программа выводит процент загруженного файла и скорость загрузки, это всё в одной строке.
После завершения выполнения программы вывод получается такой:
КОД-1
# megacmd sync /tmp/site/ mega:/backup/latest/
Found 1 file(s) to be copied
Copying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 100.00 % of 5.9MB at 154K/s 39s
Successfully sync /tmp/site/ to mega:/backup/latest/ in 39s


где строка
Copying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 100.00 % of 5.9MB at 154K/s 39s

в течении некоторого времени изменялась (проценты, скорость)

Но дальше появляется проблема: если в консоле вывести содержимое
cat log.txt
Вывод будет идентичен первому примеру (КОД-1)

А если открыть файл в текстовом редакторе или считать в переменную через
OUTPUT=$(cat log.txt)
то переменная OUTPUT будет содержать совершенно другой результат:
КОД-2
Found 1 file(s) to be copied

[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 0.00 % of 5.9MB at 0B/s 0s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 0.00 % of 5.9MB at 0B/s 1s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 0.00 % of 5.9MB at 0B/s 2s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 2.24 % of 5.9MB at 46KB/s 2s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 2.24 % of 5.9MB at 46KB/s 3s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 2.24 % of 5.9MB at 46KB/s 4s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 6.71 % of 5.9MB at 68KB/s 5s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 6.71 % of 5.9MB at 68KB/s 6s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 6.71 % of 5.9MB at 68KB/s 7s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 6.71 % of 5.9MB at 68KB/s 8s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 13.43 % of 5.9MB at 85KB/s 9s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 13.43 % of 5.9MB at 85KB/s 10s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 13.43 % of 5.9MB at 85KB/s 11s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 13.43 % of 5.9MB at 85KB/s 12s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 12s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 14s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 15s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 16s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 17s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 18s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 19s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 20s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 22.38 % of 5.9MB at 101K/s 21s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 35.80 % of 5.9MB at 95KB/s 21s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 35.80 % of 5.9MB at 95KB/s 22s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 35.80 % of 5.9MB at 95KB/s 23s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 46.99 % of 5.9MB at 114K/s 24s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 46.99 % of 5.9MB at 114K/s 25s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 46.99 % of 5.9MB at 114K/s 26s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 46.99 % of 5.9MB at 114K/s 27s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 48.53 % of 5.9MB at 104K/s 27s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 64.20 % of 5.9MB at 137K/s 27s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 64.20 % of 5.9MB at 137K/s 28s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 64.20 % of 5.9MB at 137K/s 29s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 64.20 % of 5.9MB at 137K/s 30s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 30s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 31s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 32s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 33s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 34s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 35s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 36s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 82.10 % of 5.9MB at 156K/s 37s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 100.00 % of 5.9MB at 154K/s 37s 
[2KCopying /tmp/site/1.tar -> mega:/backup/latest/1.tar # 100.00 % of 5.9MB at 154K/s 39s 
Successfully sync /tmp/site/ to mega:/backup/latest/ in 39s


Вопрос: как можно записать в переменную вывод/лог, как если бы я сделал "cat log.txt" в консоле линукс (чтобы получить вывод КОД-1)?
Или возможно ли сразу записать в переменную вывод как в КОД-1?
Спасибо.
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 4
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Вывод _И_ ошибки нужно записывать так:
megacmd sync /tmp/site/ mega:/backup/latest/ >log.txt 2>&1


Код "[2K" в начале каждой строки "Copying ..." заставляет консоль переместить текстовый курсор в начало строки. Поэтому каждая следующая строка отображается поверх предыдущей строки, и именно поэтому проценты в этой строке меняются, а экран не заполняется строками.

А вот как из всего набора строк оставить только последнюю, с максимальным процентом... Хмммм... Один из вариантов:
head -n1 log.txt >log2.txt ; grep 'Copying ' log.txt | tail -n1 >>log2.txt ; tail -n1 log.txt >>log2.txt
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
А так пробовали?
RESULT=$(megacmd sync /tmp/site/ mega:/backup/latest/ 2>&1)
echo "Exit code: $?"
echo "Result: $RESULT"
Ответ написан
xotkot
@xotkot
хорошо есть и хорошо весьма
awk '$1 == "Found" || $1 == "Successfully" || /100.00 %/' log.txt
Ответ написан
@Karpion
напрямую в переменную вывод всегда получается пустой
Вы бы написали, как Вы это делаете. Если Вы перенаправляете знаком "больше" - то это только в файл. Поместить вывод команды в переменную можно двумя способами:
переменная=`команда`
переменная=$(команда)
Команда м.б. с аргументами. В Вашем случае, видимо, она должна содержать ещё и 2>&1 (собственно, про это уже написали).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы