греп і хвіст -f?


28

Чи можливо зробити tail -f(або подібний) файл і grepвін одночасно? Я б не проти інших команд просто шукати таку поведінку.

Відповіді:


46

Використовуючи GNU tailта GNU grep, я можу зрозуміти, tail -fвикористовуючи синтаксис прямого напряму:

tail -f /var/log/file.log | grep search_term

Це рішення, яке працює з іншими реалізаціями цих двох утиліт, а не лише з GNU.
Kusalananda

7

Це буде добре працювати; загалом, grepбудете чекати, коли програма не виводить, і продовжуватимете читати по мірі надходження результату, тому якщо ви зробите це:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Нічого не відбудеться протягом 5 секунд, тоді grep виведе відповідний "тест", а потім через п’ять секунд він вийде, коли піпетний процес зробить


7

Додати --line-bufferedдо grep, і це може зменшити затримку для вас. Дуже корисно в деяких випадках.

tail -f foo | grep --line-buffered bar

2
Це корисно, коли вихід grepне переходить до терміналу (переспрямований на інший тип файлу). Буферизація рядків є типовим, коли вихід надходить до терміналу, тому це не матиме ніяких змін. Зауважте, що цей варіант є специфічним для GNU.
Стефан Шазелас


2

Я бачу, як усі ці люди говорять про використання tail -f, але мені не подобаються обмеження цього! Мій улюблений метод пошуку файлу під час перегляду нових рядків (наприклад, я зазвичай працюю з файлами журналів, до яких додається перенаправлений вихід процесів, що періодично виконуються через завдання cron):

 tail -Fn+0 /path/to/file|grep searchterm

Це передбачає хвіст і греп GNU. Інформація про підтримку з хвостової сторінки (GNU coreutils, моя версія 8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Отже, хвостова частина моєї команди прирівнюється до tail --follow --retry --lines=+0, де остаточний аргумент спрямовує її починати на початку, пропускаючи нульові рядки.


1
tail -f access | awk '/ADD/{print $0}'

Використовуйте вище, я використовую його зазвичай.


0

Ви можете використовувати netcat, щоб зібрати результати хвоста -f, оскільки нові результати приходять досить легко.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Це встановлює grep для прослуховування результатів для входу, що надходить з порту 1337.
Друга команда передає вихід хвоста -f на netcat і надсилає його localhost 1337. Для цього локально потрібно переключити ttys для кожного з двох наборів команд або використовувати щось на зразок екрана.


0

Це працює. Але слідкуйте за тим, щоб вихід більше не був миттєвим: він потрапляє через трубу.


Домовились. Щоб перевірити це, відкрийте два вікна. Запустити tail -fв одне вікно, а tail -f logfile | grep patternв інше вікно. Рядки, що містять pattern, не завжди з’являються в обох вікнах одночасно. Я бачив, як рядки з'являються на відстані 30 секунд, рідко, що дратує.
Стефан Ласєвський

Це може мати більше спільного з перегортанням системи між запуском одного чи іншого екземпляра хвоста. Краще випробування ми teeчи щось.
Кевін Канту
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.