LINUX.ORG.RU

man tailf
TAILF(1)                         User Commands                        TAILF(1)



NAME
       tailf - follow the growth of a log file

SYNOPSIS
       tailf [OPTION] file

DESCRIPTION
       tailf  will print out the last 10 lines of a file and then wait for the
       file to grow.  It is similar to tail -f but does not  access  the  file
       when  it  is not growing.  This has the side effect of not updating the
       access time for the file, so a filesystem flush does not occur periodi‐
       cally when no log activity is happening.

Используй просто tail.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

Покажи вывод по очереди:

tailf /etc/hosts
tailf /etc/hosts |grep 127

Nicholass ★★★
()

[root@localhost ~]# tailf /etc/hosts | grep 127
127.0.0.1 localhost localhost.localdomain localhost4 >localhost4.localdomain4
^C
[root@localhost ~]# tailf /etc/hosts | grep 127 | grep localhost
^C
[root@localhost ~]#

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

Это находит 2 строчки, а нужно одну

tailf /etc/hosts | grep -e «127» -e «localhost»
127.0.0.1 localhost localhost.localdomain localhost4 >localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 >localhost6.localdomain6
^C

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

Файл взят доя примера. Интересует почему греп ламается после второго пайпа.

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

Видимо причина в другом:

[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

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

Как вариант, но стоит условие получить аналог нескольких проходов. Например вначале

grep localhost

, а затем

grep -v ::1

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

Видимо причина в другом:

Кстати, хорошая загадка на понимание Unix. Посмотрим кто решит. Упростим, заодно быстрее наступит понимание. Сравните и объясните разницу:

( echo "#127.0.0.1      localhost";  ) | grep 127 | grep localhost

( echo "#127.0.0.1      localhost";  sleep 10 ) | grep 127 | grep localhost

Почему вывод во втором случае появляется через 10 секунд? ;)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

Вот еще пример поведения других tail'ов, возможно натолкнет на мысль:

[root@localhost ~]# tail /etc/hosts | grep localhost | grep -v ::1
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4[root@localhost ~]# tail -f /etc/hosts | >grep localhost | grep -v ::1
^C

(второй пример не сработал)

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

Потому что sleep - вторая команда для баша?

fenicks
() автор топика

Всем спасибо, причина найдена. Первый grep буферизировал вывод и второй греп его уже не получал. Вот пример работающего запроса:

[root@localhost ~]# tailf /etc/hosts | grep --line-buffered localhost | grep -v ::1
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
^C

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

Первый grep буферизировал вывод

Это правильно в общем случае, но ответ не на 5 :) Дополнительный вопрос, почему вот это сразу печатает, а не ждёт 10 секунд?

( echo "#127.0.0.1      localhost";  sleep 10 ) | grep 127 

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

Кажется примерно разобрался. Команды в скобках передаются по очереди (как строки из /etc/hosts) и проходят все пайпы, после чего выводится результат. Когда строка поступает на stdin первого грепа он кладет её в буффер и ждет следующие строки и это строка sleep, которая и заставляет его уснуть на 10 секунд. Через 10 секунд, stdin заканчивается (как это понимает греп не совсем ясно) и греп радостно выводит результаты своей работы.

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

Кажется примерно разобрался.

Увы.

Правильный ответ в том, что stdio по разному буфферизует. При выводе в файл или трубу stdio буферизует по BUFSIZ|PIPE_SIZE (обычно равно PAGE_SIZE), а при выводе в терминал - построчно. Естественно, когда программа завершается, то libc-шный exit вызывает тоже flushall().

Поэтому первый grep на терминал выводит сразу, а в трубу - ждёт.

PS: То что в скобках - это просто инлайновая запись скрипта, можно рассматривать как вызов одной команды «echo_and_sleep».

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Значит буферизирует не grep а сам stdio? Но ведь между echo и первым грепом тоже стоит пайп. Разве не должен включаться буфер PIPE_SIZE уже на этом этапе?

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

Значит буферизирует не grep а сам stdio?

Эээ, что по вашему stdio? :) stdio - это набор стандартного высокоуровневого ввода/вывода libc. Именно потому, что он позволяет вот такие фокусы, когда setbuf() разный для разного типа он и высокоуровневый - много о себе мнит, иногда это вредно.

Но ведь между echo и первым грепом тоже стоит пайп.

echo полностью отработало и завершилось, потому в буффер пайпа информация отправлена. Это аналог tailf, в тесте использован sleep для эмуляции, что программа на конце с трубой, в которой пишут — не завершилась, конца файла нет и все остальные программы также ждут завершения файла, но порция вывода отправлена. Потому, если первый grep работает с терминалом, то он выводит строку сразу, если на конце строки есть перевод строки.

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