2

Я написал приложение для 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 ответа2

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)

В bash конструкция >(...) называется процессом подстановки. Он запускает команды в скобках и помещает их в подобный файлу объект. 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)
1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .