Скрипт 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
в целом.