Пусть тройник лучше обрабатывает возврат каретки
Я написал приложение для 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)
РЕДАКТИРОВАТЬ: Уточненный ответ, чтобы лучше соответствовать вопросу.