2

Есть еще один вопрос, который почти такой же, но ни одно из предложений из его ответа не работает для меня:пайпинг -f в awk

Я пытаюсь подключить -fa logfile, но хочу заменить \r на \n перед его отображением, чтобы терминал не перезаписывал сам себя, а вместо этого позволял мне прокручивать вывод.

это работает как подозревается:

tail -f -c 1000 "mycustom.log"

и это также:

tail -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'

ни один из этих трех, тем не менее, никогда ничего не печатал на моей консоли

tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
stdbuf -o0 tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'
unbuffer tail -f -c 1000 "mycustom.log" | mawk 'gsub("\r","\n")'

Чтобы unbuffer был известен моей системе, мне пришлось установить пакет expect-dev

использование awk или mawk , похоже, не имеет значения. Я также написал вариант sed :

sed 's/\r/\n/g'

который ведет себя так же для меня.

Я также нашел этот вопрос:
https://stackoverflow.com/questions/15325548/how-to-use-tail-in-combination-with-sed
Но параметр sed -u для меня ничего не меняет, и конструкция $ '..' идентифицируется как синтаксическая ошибка моим sed - изменение его на \$ '...' выполняется, но с использованием tail -f piping to он никогда не печатает ничего, как все, что я пробовал.

Могу ли я попробовать что-нибудь еще? Проблема в том, что я использую глобальную команду в sed / awk? Или, может быть, проблема в том, что исходный поток, созданный tail -f представляет собой "одну строку", поскольку в нем нет \n? Есть ли способ, чтобы sed или awk обрабатывали куски меньше, чем строка за строкой?

Есть ли альтернатива для замены всех \r на \n, которые могут работать с tail -f?

1 ответ1

1

Итак, я нашел свой ответ: так как мой файл журнала выглядит как одна строка для awk и sed, которая никогда не завершается (в случае tail -f), они никогда ничего не выведут. Итак, я написал этот обходной путь:

tail -c 1 -f "$path" | while read -r -n1 char
do
  if [ "$char" = $'\r' ] ; then
    echo ""
  else
    echo -n "$char"
  fi
done

это некрасиво, но работает;)

ОБНОВЛЕНИЕ: Пользователь G-Man предложил более приятный способ, который также работает:

tail -c 1 -f "$path" | tr "\r" "\n"

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