Удаление индикатора выполнения из вывода программы, перенаправленного в файл журнала - PullRequest
1 голос
/ 21 марта 2020

Я запустил программу, и она выведет индикатор выполнения. Я сделал это так

python train.py |& tee train.log

train.log выглядит следующим образом.

Это строка 1

Training ...

Это строка 2

...
[000] valid: 100%|█████████████████████████████████████████████████████████████▉| 2630/2631 [15:24<00:00,  2.98 track/s]
[000] valid: 100%|██████████████████████████████████████████████████████████████| 2631/2631 [15:25<00:00,  3.02 track/s]                                                                                                              
Epoch 000: train=0.11940351 valid=0.10640465 best=0.1064 duration=0.79 days

Это строка 3 ...

[001] valid: 100%|█████████████████████████████████████████████████████████████▉| 2629/2631 [15:11<00:00,  2.90 
[001] valid: 100%|█████████████████████████████████████████████████████████████▉| 2630/2631 [15:11<00:00,  2.89 
[001] valid: 100%|██████████████████████████████████████████████████████████████| 2631/2631 [15:12<00:00,  2.88                                                                                                   
Epoch 001: train=0.10971066 valid=0.09931737 best=0.0993 duration=0.79 days

На терминале они должны рассматриваться как заменяющие себя, следовательно, в файле журнала есть много повторений. Поэтому, когда я сделал wc -l train.log, он вернул только 3 строки. Однако когда я открыл этот текстовый файл размером 5 МБ в текстовом редакторе, там было примерно 20000 строк.

Моя цель - получить только эти данные:

Epoch 000: train=0.11940351 valid=0.10640465 best=0.1064 duration=0.79 days    
Epoch 001: train=0.10971066 valid=0.09931737 best=0.0993 duration=0.79 days

Мои вопросы:

  1. Как мне, не останавливая мой текущий прогресс в обучении, извлечь желаемые детали из предположительно "3" строк train.log? Имейте в виду, что это обучение будет проходить непрерывно еще 10 эпох, поэтому я не хочу открывать весь редактор прогресса в редакторе.

  2. В будущем, как я должен сохранить свой лог-файл (вместо вызова python train.py |& tee train.log) так, чтобы хотя я мог видеть индикатор выполнения в терминале, я только сохранял важную информацию в текстовом файле?

Редактировать 1: Вот ссылка на файл train.log

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Индикаторы выполнения, вероятно, записываются в stderr, который вы отправляете на tee вместе с stdout, используя |&.

Чтобы записать только stdout в файл, используйте вместо этого обычный конвейер | .


Индикатор выполнения был сгенерирован путем записи одной строки, а затем символа возврата каретки (\r), но без новой строки символа (\n). Чтобы это исправить и продолжить обработку файла, вы можете использовать, например, sed 's/\r/\n/g'.

С файлом, связанным в вопросе, работает следующее:

$ sed 's/\r/\n/g' train.log | grep Epoch
Epoch 000: train=0.11940351 valid=0.10640465 best=0.1064 duration=0.79 days
0 голосов
/ 23 марта 2020

Хорошо, я уже решил это.

Согласно этот вопрос ,

Вы делаете индикатор выполнения, выполняя echo -ne "your text \r" > log.file.

Так как некоторые редакторы, которые я использовал (Блокнот, возвышенный текст 3), распознают \r как разрыв строки, вы видите их как отдельную строку, но на самом деле они хранятся в одной строке.

Итак, чтобы перепроектировать его, вы можете превратить их в настоящие прерыватели строки sed -i "s,\r,\n,g" train.log и grep соответственно.

В любом случае, спасибо @ mkrieger1 за помощь в любом случае!

...