tail -f path
Вищезгадане буде виводити модифікації до файлу миттєво, але я хочу застосувати фільтр до виводу, показувати лише тоді, коли в ньому є ключове слово xxx
.
Як до цього підійти?
tail -f path
Вищезгадане буде виводити модифікації до файлу миттєво, але я хочу застосувати фільтр до виводу, показувати лише тоді, коли в ньому є ключове слово xxx
.
Як до цього підійти?
Відповіді:
За допомогою Unix ви можете передавати вихід однієї програми в іншу.
Отже, щоб відфільтрувати хвіст, ви можете використовувати grep:
tail -f path | grep your-search-filter
Коротка відповідь: tail -f somefile | grep somepattern
Однак це, як правило, не вдається. Скажімо, ви підказуєте файл, який часто обертається (якщо це журнал налагодження, він може бути повернутий кілька разів). У такому випадку tail -F
ваш друг. Я дозволю вам переглянути різницю.
Але tail -f
і tail -F
роздрукуйте спочатку купу рядків, що часто небажано в цьому випадку використання, тому в цьому випадку додайте-n0
tail -F -n0 somefile | grep somepattern
Це буде добре, до тих пір, поки ви не захочете виконати якусь іншу фільтрацію, і тоді вам потрібно остерігатися буферизації. stdout буферизований за замовчуванням під час запису в термінал, але при повному буферизації під час запису в трубу. Отже, наступні дані випромінюватимуть рядки, як тільки вони будуть знайдені, тому що tail
це явно буферні лінії (або він видає вихід у кінці кожного рядка), а grep
також буферний, оскільки його вихід надходить до вашого терміналу:
tail -F -n0 somefile | grep somepattern
Але тоді ви вирішили використовувати щось на кшталт awk
або cut
додатково обробити вихід.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
І тепер вам цікаво, куди пішов ваш результат ... залежно від обсягу журналів, ви можете виявити, що ви отримуєте результат, але це буде сторінка за часом, тому що тепер stdout grep
функціонує в повному розмірі , і таким чином awk
отримує вхід 4 кБ за один раз (за замовчуванням).
У цьому випадку ви можете сказати, grep
щоб завжди робити рядок stdout буферизованим, використовуючи --line-buffered
параметр.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Однак у більшості команд немає аналога --line-buffered
. У випадку з більш інструментами, написаними на скрипті, ви можете використовувати функцію для відмивання результатів (наприклад, в awk
, функція є fflush()
, яка має те саме ім'я, що і її аналог C, такі інструменти, як Perl і Python, мають щось подібне).
З подібними подобами cut
вам, швидше за все, не пощастить; ... але ви можете спробувати пошукати unbuffer
, що, на мою думку, щось передбачене expect
ланцюжком інструментів (я його ніколи не використовував).
Сподіваюся, ви знайшли це корисним.
Ура, Камерон
і ви можете використовувати декілька труб і грепсів, а також виключати речі з grep -v, отримати нечутливість регістру з grep -i тощо.
тобто: хвіст -100f / var / log / messages | grep -V ACPI | греп -і ата
почніть обводити 100 рядків з кінця і продовжуйте виводити хвости, спочатку виключіть будь-які рядки з ACPI, потім покажіть лінії з ата, ATA або будь-яку суміш з них.
Ще одним зручним варіантом є параметри ABC для рядків After, Before та Context (рядки до і після).