LINUX.ORG.RU

Обрезать файл после ключевого слова при помощи sed

 


0

1

Всем привет,

Появилась задача обрезать лог программы после первого встреченного слова END. Лог в бинарном формате, END вставляется обычным текстом, может встречаться несколько раз. Для обработки лога уже есть скрипт, использующий sed, поэтому желательно использовать его же. Подскажите пожалуйста, как это реализовать.

Ответ на: комментарий от anonymous

// на всякий случай негнутый: sed -n '/END/q;p'

anonymous
()
Ответ на: комментарий от beastie

Спасибо! Только судя по всему в файле есть переносы строк, и такой командой sed удаляет не только информацию после END, но и саму строку, содержащую END, а перед ним могут находиться важные данные.

ignoramus8
() автор топика
Ответ на: комментарий от anonymous

sed /END/q оставляет всю строку, включающую END, а ее надо обрезать после END sed -n '/END/q;p' работает аналогично sed '/END/,$d'

Проблема может быть в том, что лог в бинарном формате? По-моему ничего сложного не должно быть в том, чтобы найти 3 буквы и удалить всё после них :) вот только sed'ом я не владею.

ignoramus8
() автор топика
Ответ на: комментарий от ignoramus8

s/END.*// - обрежет, несложно скомбинировать, и таки не читать маны перед подобными вопросами не совсем «бонтон»

anonymous
()
Ответ на: комментарий от ignoramus8

вот только sed'ом я не владею

А чем владеешь? Вот, например (для слишком жирного лога может быть неприемлимо): awk -v RS=END -v ORS= '{print; exit}'

Проблема может быть в том, что лог в бинарном формате?

Для большого файла, вероятно будет правильнее найти позицию END, а потом truncate.

anonymous
()
Ответ на: комментарий от anonymous

// > найти позицию END - grep -b, скажем

anonymous
()
Ответ на: комментарий от anonymous

А чем владеешь?

Скриптов в своей работе я редко касаюсь.. в основном программирование C++, erlang.

s/END.*//

Эта штука почему-то вообще ничего не выводит

awk -v RS=END -v ORS= '{print; exit}'

а это работает именно как надо!

ignoramus8
() автор топика
Ответ на: комментарий от ignoramus8

s/END.*//

Потому что надо было «скомбинировать»), и .* - гк, каюсь, для тех, кто наткнется (вдруг) на тему:

sed '/END/ {s//\n/;P;Q}'
// негнутый "-n '{... P;q}; p'" ну и возможно (нету на чем проверить) перевод строки \n -> \<явный newline>

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.