Чи можливо зробити tail -f
(або подібний) файл і grep
він одночасно? Я б не проти інших команд просто шукати таку поведінку.
Чи можливо зробити tail -f
(або подібний) файл і grep
він одночасно? Я б не проти інших команд просто шукати таку поведінку.
Відповіді:
Це буде добре працювати; загалом, grep
будете чекати, коли програма не виводить, і продовжуватимете читати по мірі надходження результату, тому якщо ви зробите це:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Нічого не відбудеться протягом 5 секунд, тоді grep виведе відповідний "тест", а потім через п’ять секунд він вийде, коли піпетний процес зробить
Додати --line-buffered
до grep
, і це може зменшити затримку для вас. Дуже корисно в деяких випадках.
tail -f foo | grep --line-buffered bar
grep
не переходить до терміналу (переспрямований на інший тип файлу). Буферизація рядків є типовим, коли вихід надходить до терміналу, тому це не матиме ніяких змін. Зауважте, що цей варіант є специфічним для GNU.
Ви можете просто передати висновок grep
вtail -f
. Існують також програми, що поєднують tail -f
функціональність з фільтруванням та забарвленням, зокрема багатожитлові ( приклади ).
Я бачу, як усі ці люди говорять про використання 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
, де остаточний аргумент спрямовує її починати на початку, пропускаючи нульові рядки.
tail -f access | awk '/ADD/{print $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 для кожного з двох наборів команд або використовувати щось на зразок екрана.
Це працює. Але слідкуйте за тим, щоб вихід більше не був миттєвим: він потрапляє через трубу.
tail -f
в одне вікно, а tail -f logfile | grep pattern
в інше вікно. Рядки, що містять pattern
, не завжди з’являються в обох вікнах одночасно. Я бачив, як рядки з'являються на відстані 30 секунд, рідко, що дратує.
tee
чи щось.