Хвостовой скрипт для записи содержимого файла от конца до совпадающего шаблона

Я ищу решение небольшого варианта этого хвостового вопроса... надеюсь, что кто-то знает решение. В основном я хочу tail файл до тех пор, пока строка / шаблон не будет сопоставлена, а затем записать содержимое с конца файла до строки, содержащей этот шаблон (или до этого шаблона). Решение по этой ссылке с небольшой модификацией для повторного -прямой вывод в новый файл:

sh -c 'tail -n +0 --pid=$$ -f tmp.log | { sed "/pattern/ q" && kill $$ ;}' >& tmp.txt 

дал мне полную противоположность (содержит файл сверху до совпадения строки / шаблона). Цените любые идеи - спасибо за уделенное время.


person squashed.bugaboo    schedule 13.05.2013    source источник
comment
так хотите строчки в обратном порядке? Последняя строка в файле должна идти первой и так далее до шаблона? Или просто хотите распечатать содержимое файла от последнего появления шаблона до конца файла?   -  person jm666    schedule 13.05.2013
comment
Да, последнее в вашем описании. (Не обратный порядок).   -  person squashed.bugaboo    schedule 13.05.2013


Ответы (3)


Используйте вместо этого:

sed -n '/pattern/,// p' >tmp.txt <tmp.log

Похоже, вам не нужен флаг -f для tail, поскольку он продолжает попытки чтения за пределами конца файла (на случай, если кто-то еще добавит к файлу). Это устраняет необходимость убивать tail, когда вы находите pattern, и фактически полностью устраняет необходимость использования tail.

person Sir Athos    schedule 13.05.2013
comment
Ах .. ты мог бы быть прав? Зачем мне здесь хвост? Да ... позволь мне попробовать. Спасибо. - person squashed.bugaboo; 13.05.2013
comment
Это сработало в одном простом случае; но когда я попробовал другой с несколькими шаблонами, это дало мне неожиданный результат ... нужно, чтобы он записывался до первого появления шаблона. - person squashed.bugaboo; 13.05.2013

Потому что мне непонятно, откуда вы хотите распечатать, например от ПЕРВОГО появления шаблона или ПОСЛЕДНЕГО - вот решение для обоих.

Для примера будет использоваться следующий «файл журнала»

line1 aa
line2 bb
line3 cc
line4 bb
line5 ee
line6 bb
line7 gg

и будет искать шаблон bb.

#!/bin/bash
PATTERN="bb"
LOGFILE="/tmp/logfile"
tail -r "$LOGFILE" | sed -n '1,/bb/p' | tail -r

распечатает строки от ПОСЛЕДНЕГО появления bb до конца файла

line6 bb
line7 gg

в

#!/bin/bash 
PATTERN="bb"
LOGFILE="/tmp/logfile"
sed -n "/$PATTERN/,\$p" < $LOGFILE

распечатает - от 1-го появления шаблона до конца файла

line2 bb
line3 cc
line4 bb
line5 ee
line6 bb
line7 gg
person jm666    schedule 13.05.2013
comment
Спасибо jm666 .. нашел однострочный ответ (я опубликовал ниже), который соответствует моим требованиям ... да, я хотел извлечь из первого вхождения шаблона до конца файла и записать его в другой файл, скажем .. - person squashed.bugaboo; 13.05.2013
comment
@ squashed.bugaboo: sed -n '/pattern/,$p' < log >tmp недостаточно одного лайнера? ;) :) Но конечно, awk крутой;) - person jm666; 13.05.2013

Хорошо ... Я думаю, осмотревшись, я нашел то, что я считаю решением моей проблемы. Приносим извинения за изменение определения проблемы на полпути (несколько вхождений шаблона). Вот исправление с использованием awk:

awk '/pattern/{i++}i' tmp.log >& tmp.txt

Спасибо всем, кто комментировал / отправлял идеи. Ценить это.

person squashed.bugaboo    schedule 13.05.2013