Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Как использовать перенос строки в левой части sed?

#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).

Комментариев нет:

Отправить комментарий