Как я могу отобразить ход rsync из файла журнала без возврата каретки?

У меня есть файл журнала команды rsync с прогрессом. При запуске этот прогресс обновляет отображаемую информацию в той же строке. Когда я фиксирую вывод этой команды, я получаю файл, который обычно отображается с cat на терминале (все пробелы и повторные правки воспроизводятся), но я хочу иметь возможность использовать grep в файле и обрабатывать его, чтобы я видел все команды редактирования backspace. Как я могу обработать файл, чтобы удалить все обновления прогресса и просто получить файл с окончательными правками?


person Community    schedule 01.11.2009    source источник


Ответы (2)


Если вы хотите увидеть, как выглядит ваш захваченный файл без перезаписи предыдущих строк прогресса:

sed 's/\r/\n/g' capture-file

что может дать что-то вроде этого:

created directory /some/dest/dir
filename

       32768   0%    0.00kB/s    0:00:00
     6717440  21%    6.38MB/s    0:00:03
    13139968  41%    6.25MB/s    0:00:02
    19791872  62%    6.28MB/s    0:00:01
    26214400  82%    6.24MB/s    0:00:00
    31784420 100%    6.25MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 31788388 bytes  received 31 bytes  3346149.37 bytes/sec
total size is 31784420  speedup is 1.00

Если вы хотите увидеть только последний шаг сообщения о ходе выполнения и удалить предыдущие:

sed 's/.*\r/\n/g' capture-file

Что может выглядеть так:

created directory /some/dest/dir
filename

    31784420 100%    6.25MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 31788388 bytes  received 31 bytes  3346149.37 bytes/sec
total size is 31784420  speedup is 1.00

Вы можете запустить rsync с параметром --log-file=name для записи информации журнала в файл. Замените «имя» на имя, которое вы хотите. Вы можете управлять регистрируемой информацией с помощью параметра log-file-format (подробности см. в разделе о формате журнала в man rsyncd.conf).

В моей системе файл журнала rsync по умолчанию выглядит так:

2009/11/01 17:19:20 [23802] building file list
2009/11/01 17:19:20 [23802] created directory /some/dest/dir
2009/11/01 17:19:25 [23802] <f+++++++++ filename
2009/11/01 17:19:25 [23802] sent 31788388 bytes  received 31 bytes  3346149.37 bytes/sec
2009/11/01 17:19:25 [23802] total size is 31784420  speedup is 1.00
person Dennis Williamson    schedule 01.11.2009
comment
--log-file arg был тем, что мне было нужно здесь - person lunguini; 08.02.2019

Во-первых, я предполагаю, что индикаторы прогресса важны для вас по разным причинам, потому что самое простое решение — просто отключить их. Во-вторых, я предполагаю, что нет способа заставить rsync записывать журнал со всем, кроме индикаторов прогресса, в отдельный файл из того, что он показывает на экране. Наконец, я предполагаю, что вам вообще не нужны какие-либо индикаторы прогресса в файле журнала, который вы позже обрабатываете с помощью других инструментов.

Принимая во внимание эти два предположения, вы можете убрать индикаторы выполнения, просматривая каждую строку на наличие символов \b или \r и отбрасывая все строки, в которых есть эти символы. Это может быть так же просто, как командная строка grep, которая выглядит так:

grep -ve "$(echo -ne '[\b\r]')" logfile

Это предполагает, что у вас есть оболочка, поддерживающая подстановку аргументов в стиле "$(...)", и команда echo, поддерживающая аргументы -e.

person Omnifarious    schedule 01.11.2009
comment
Вы можете пропустить echo: grep -v $'[\b\r]' logfile, но это и ваша команда полностью исключат строки прогресса, а не то, что, как я думаю, хочет ОП. - person Dennis Williamson; 02.11.2009
comment
В руководстве по версии grep для OSX не утверждается, что оно понимает, что означают \b и \r. - person Omnifarious; 02.11.2009