2013-12-26 2 views
0

Я хочу, чтобы хвост только обновленную строку файла не весь контентTailing обновляется только строка файла

хвост -F/путь к файлу

отображает все строки из файла. Мне нужно отображать только новые строки, добавленные в файл, может ли кто-нибудь помочь мне в этом?

, например. Я хочу видеть только обновленные строки в файле, например, если файл имеет 10 строк tail -F показывает мне 10 строк на терминале сейчас, если добавлено еще 5 строк, я должен уметь видеть только новые 5 строк не все 15 строк

EDIT Я настроил желоб для отправки данных журнала в HBase я использую «хвост -F/путь к файлу» который дает мне все файлы линия каждый раз, когда будет updated.Only обновленных данных журнала (скажем, 5 добавленные строки) должны быть отправлены в hbase, иначе будет избыточность данных.

С уважением Chhaya

+0

Вы имеете в виду, что хотите видеть только строки, которые были добавлены с момента последнего вызова 'tail' в файле? Вам нужно будет написать собственный скрипт, чтобы вести подсчет строк, но это не должно быть слишком сложно. Однако сценарии с такой памятью на самом деле не являются способом UNIX. Идея «tail -F» заключается в том, что вы поддерживаете ее работу (например, в файле журнала) и получаете новые строки по мере их добавления. – Bandrami

+0

«Идея хвоста -F заключается в том, что вы поддерживаете его работу (например, в файле журнала) и получаете новые строки, поскольку они добавлены« Я сохранил хвост в одном терминале, затем открыл новый терминал и изменил файл, теперь я могу видеть все строки из файла вместе с новыми строками. я просто хочу видеть новые строки –

+0

Я помещаю эти данные в hbase, поэтому будет повторение данных, которые не так, как я хочу –

ответ

1

Я предполагаю, что это файл журнала?

Так что, возможно, вместо того, чтобы пытаться вспомнить, что было написано в последний раз, и отображать только что нового, вы, вероятно, захотите использовать систему ведения журнала (например, syslogd или более новую версию) , и сообщить ему, чтобы войти в файл и отправить его в лоток?

В противном случае, здесь грязный хак: создать файл «shownew.sh», содержащий:

#try to be as "atomic" as possible: we will all do with a copy of ${1}, to "freeze" time 
cp -p "${1}" "${1}.cur" #very important. "freezes" the state of $1 

if [ -f "${1}.old ]; then 

    diff "${1}.old" "${1}.cur" | grep '^> ' | sed -e 's/^> //' 

else 

    cat "${1}.cur" #show the file at the time of invocation 

fi 

mv -f "${1}.cur" "${1}.old" #we just showed "${1}.cur" (or the diff between ${1}.cur and a previous ${1}.old=. 
    # so we now move that ${1}.cur $^{1}.old, for the next iteration 
    #We used a ${1}.cur instead of ${1} because ${1} may be updated at any time, and it's possible we copy a "$1" updated since the display of differences! By using ${1}.cur instead, this won't be a problem 

#edit: after the OP's comment he wants to tail -f the file too: 
#and now we showed the diffs since $1.old, we continue to display what is new in $1, using tail -f: 

#since we showed ${1}.cur (now known as ${1}.old}, $1 may have changed? 
diff "${1}" "${1}.old" | grep '^> ' | sed -e 's/> //' 

#and now we tail -f on $1 to show what's incoming, until the user press ctrl+C 
tail -n 0 -f "${1} 

#we showed the complete ${1}, this becomes the new ${1}.old 
cp "${1}" "${1}.old" 
  • При первом вызове, скажем, shownew.sh /some/file: он отображает это все содержимое, если это в первый раз, когда вы позвонили по телефону /some/file.

  • Каждый раз, когда вы вызываете скрипт: shownew.sh /some/file: он будет показывать строки, которые теперь находятся в «$ {1}», и которые раньше не были в «$ {1} .old» ... Я надеюсь, что это что вы хотели?

+0

эй, спасибо, что так много его работает, но я хочу, чтобы он работал, как команда Tail делает? не хотят заканчивать –

+0

Непросто смешать выше, что делает «моментальный снимок» файла, а затем делает diff с хвостом -f ... Я отредактировал свой ответ, чтобы показать вам, как это сделать. Попробуйте –

0

Если ваши события журнала поступают из фреймворка Java, я рекомендую использовать приложение Log4j2 Flume. Это обеспечит, чтобы последние события добирались очень быстро.