Пусть тройник лучше обрабатывает возврат каретки

Я написал приложение для Java-консоли, которое неоднократно выводит свой статус на консоль, используя возврат каретки (\r) в конце, а не перевод строки (\n), чтобы сохранить вывод на одном экране. Я также хочу передать этот вывод в файл, как

java -jar my-jar.jar | tee /tmp/my-jar.log

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

Пример: я кодирую

System.out.print("hello\r")
Thread.sleep(2000);
System.out.println("world")

На экране появляется "привет", а через две секунды его заменяет "мир". Поэтому после завершения программы пользователь видит только "мир" на экране. Хорошо, это правильно.

Однако, если я передаю это в файл, он содержит "hello \ rworld \ n", но я хочу, чтобы он содержал только "world \ n".

Как мне сделать это в командной строке, а не кодировать это на Java (вот почему вопрос здесь, а не на SO)?

2 ответа

Решение

Используя sed

По умолчанию, sed читает разделенные строкой ввод. Эта команда удалит все до последнего \r на линии:

sed 's/.*\r//'

Например:

$ echo $'line1\n\hi\rhello\rworld' | sed 's/.*\r//'
line1
world

Чтобы использовать это с teeМы можем использовать процесс подстановки:

echo $'line1\n\hi\rhello\rworld' | tee >(sed 's/.*\r//' >Outfile)

Под баш, конструкция >(...) называется процессом замещения. Он запускает команды в скобках и помещает их в подобный файлу объект. tee запись в файл-подобный объект, и команды обрабатывают ввод.

Использование awk

Точно так же это удаляет все до последнего \r на новой строке:

awk -F'\r' '{print $NF}'

Опция -F'\r' устанавливает в качестве разделителя полей возврат каретки. Следовательно, мы хотим напечатать только последнее поле, $NFна каждой строке, разделенной новой строкой. Таким образом, print $NF,

Например:

$ echo $'line1\n\hi\rhello\rworld' | awk -F'\r' '{print $NF}'
line1
world

Чтобы использовать это с tee:

echo $'line1\n\hi\rhello\rworld' | tee >(awk -F'\r' '{print $NF}' >Outfile)

Мне удалось решить аналогичную проблему с col (Отфильтровать обратные строки от входа).

java -jar my-jar.jar | tee >(col -pb >/tmp/my-jar.log)

РЕДАКТИРОВАТЬ: Уточненный ответ, чтобы лучше соответствовать вопросу.

Другие вопросы по тегам