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

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

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

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

3 ответа

Решение

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

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

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

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

Для примера будем использовать следующий "logfile"

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

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

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

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

Другие вопросы по тегам