#linux #shell #sed
Отслеживаю логи через tailf (tail -f). Для удобства отображения хотелось бы после
каждой строки добавлять пустую строку.
Например:
$ tailf /var/log/some.log
log1
log2
log3
$ tailf /var/log/some.log | magic
log1
log2
log3
Пробовал через sed двумя способами, но получаю то же без изменений. Идея в том, чтобы
поматчить перенос строки и заменить его на два переноса. Общий синтаксис такой: sed
's/substitute_this/to_this/g'
Способ 1: вставить перенос строки как $'\n'.
$ tailf /var/log/some.log | sed "s/$'\n'/test/g"
log1
log2
log3
Похоже, что $'\n' не матчится на переносы строк в моем логе.
Способ 2: вставить перенос строку как перенос строки при вводе команды:
$ tailf /var/log/some.log | sed "s/
> /test/g"
sed: -e expression #1, char 2: unterminated `s' command
$ tailf /var/log/some.log | sed "s/\
/test/g"
sed: -e expression #1, char 0: no previous regular expression
Если бы это был shell-скрипт, можно было бы использовать хак:
newline='
'
Но я-то хочу "на ходу" использовать. Сделать фукцию или alias тоже не подойдёт, т.к.
я работаю с большим количеством хостов и не имею возможности индивидуально настраивать
.bashrc.
Собственно, вопрос: что должно быть на месте magic?
Ответы
Ответ 1
Еще вариант с sed: tailf foo.log init.lxc 1455930731.917 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455930758.674 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986152.381 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986234.349 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy tailf foo.log | sed 'a\ ' init.lxc 1455930731.917 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455930758.674 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986152.381 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986234.349 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busyОтвет 2
вам надо в конце строки (а sed работает именно построчно) вставлять символ перевода строки \n. якорем (метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $: $ tail -f /var/log/some.log | sed 's/$/\n/' для изоляции от «вмешательства» оболочки программу для sed лучше заключать в одинарные кавычки (да, s/$/\n/ — это именно программа, интерпретируемая программой sed).
Комментариев нет:
Отправить комментарий