Linux tail with grep

tail -f и grep -m в скрипте

Есть приложение, которое в свой лог-файл постоянно пишет очень много инфы о своей работе. Также у этого приложения есть конфиг, который этот приклад постоянно проверяет — если конфиг изменился, то он перечитывается приложением, и инфа о статусе этой операции (ОК\неОК) тоже заносится в этот лог-файл.

Сейчас я руками изменяю конфиг и параллельно смотрю лог, вылавливая сообщение об обработке конфига. Теперь вопрос — как мне запихнуть это в скрипт? tail -f logfile | grep -m 1 status не помогает — даже после того как греп отловил нужную строку он не завершается. Скопировать предварительно кусок файла тоже не очень хороши вариант — могу просто не угадать нужное кол-во строк — в логи валится постоянно очень много инфы. С другой стороны копирование тоже приемлемый вариант, потому что я хочу еще в логах отловить строчки с новыми параметрами в конфиге, а через tail -f | grep -m мне это сделать не удастся.

В общем что посоветуете в этой ситуации? Заранее спасибо!!

Могу предложить посмотреть в сторону inotify : грепать по файлу после записи.

Или простой цикл наподобии:

как вариант в цикле проверять каждые, например, 0,5 секунд на изменение и реагировать вслучае изменения

Источник

Команда tail Linux

Все знают о команде cat, которая используется для просмотра содержимого файлов. Но в некоторых случаях вам не нужно смотреть весь файл, иногда достаточно посмотреть только то, что находится в конце файла. Например, когда вы хотите посмотреть содержимое лог файла, то вам не нужно то, с чего он начинается, вам будет достаточно последних сообщений об ошибках.

Для этого можно использовать команду tail, она позволяет выводить заданное количество строк с конца файла, а также выводить новые строки в интерактивном режиме. В этой статье будет рассмотрена команда tail Linux.

Команда tail в Linux

Перед тем как мы будем рассматривать примеры tail linux, давайте разберем ее синтаксис и опции. А синтаксис очень прост:

$ tail опции файл

По умолчанию утилита выводит десять последних строк из файла, но ее поведение можно настроить с помощью опций:

  • -c — выводить указанное количество байт с конца файла;
  • -f — обновлять информацию по мере появления новых строк в файле;
  • -n — выводить указанное количество строк из конца файла;
  • —pid — используется с опцией -f, позволяет завершить работу утилиты, когда завершится указанный процесс;
  • -q — не выводить имена файлов;
  • —retry — повторять попытки открыть файл, если он недоступен;
  • -v — выводить подробную информацию о файле;
Читайте также:  Config inc php windows

В качестве значения параметра -c можно использовать число с приставкой b, kB, K, MB, M, GB, G T, P, E, Z, Y. Еще есть одно замечание по поводу имен файлов. По умолчанию утилита не отслеживает изменение имен, но вы можете указать что нужно отслеживать файл по дескриптору, подробнее в примерах.

Использование tail

Теперь, когда вы знаете основные опции, рассмотрим приемы работы с утилитой. Самый простой пример — выводим последние десять строк файла:

Если вам недостаточно 10 строк и нужно намного больше, то вы можете увеличить этот параметр с помощью опции -n:

tail -n 100 /var/log/syslog

Когда вы хотите отслеживать появление новых строк в файле, добавьте опцию -f:

tail -f /var/log/syslog

Вы можете открыть несколько файлов одновременно, просто перечислив их в параметрах:

tail /var/log/syslog /var/log/Xorg.0.log

С помощью опции -s вы можете задать частоту обновления файла. По умолчанию данные обновляются раз в секунду, но вы можете настроить, например, обновление раз в пять секунд:

tail -f -s 5 /var/log/syslog

При открытии нескольких файлов будет выводиться имя файла перед участком кода. Если вы хотите убрать этот заголовок, добавьте опцию -q:

tail -q var/log/syslog /var/log/Xorg.0.log

Если вас интересует не число строк, а именно число байт, то вы можете их указать с помощью опции -c:

tail -c 500 /var/log/syslog

Для удобства, вы можете выбирать не все строки, а отфильтровать интересующие вас:

tail -f /var/log/syslog | grep err

Особенно, это полезно при анализе логов веб сервера или поиске ошибок в реальном времени. Если файл не открывается, вы можете использовать опцию retry чтобы повторять попытки:

tail -f —retry /var/log/syslog | grep err

Как я говорил в начале статьи, по умолчанию опция -f или —follow отслеживает файл по его имени, но вы можете включить режим отслеживания по дескриптору файла, тогда даже если имя измениться, вы будете получать всю информацию:

tail —follow=descriptor /var/log/syslog | grep err

Выводы

В этой статье была рассмотрена команда tail linux. С помощью нее очень удобно анализировать логи различных служб, а также искать в них ошибки. Надеюсь, эта информация была полезной для вас.

Источник

grep and tail -f?

Is it possible to do a tail -f (or similar) on a file, and grep it at the same time? I wouldn’t mind other commands just looking for that kind of behavior.

8 Answers 8

Using GNU tail and GNU grep , I am able to grep a tail -f using the straight-forward syntax:

Add —line-buffered to grep , and that may reduce the delay for you. Very useful in some cases.

It will work fine; more generally, grep will wait when a program isn’t outputting, and keep reading as the output comes in, so if you do:

Nothing will happen for 5 seconds, then grep will output the matched «test», and then five seconds later it will exit when the piped process does

You can just pipe the output of grep into tail -f . There are also programs that combine tail -f functionality with filtering and coloring, in particular multitail (examples).

Читайте также:  Не открывает flash mac os

I see all these people saying to use tail -f , but I do not like the limitations of that! My favorite method of searching a file while also watching for new lines (e.g., I commonly work with log files to which are appended the redirected output of processes executed periodically via cron jobs) is:

This assumes GNU tail and grep. Supporting details from the tail manpage (GNU coreutils, mine is v8.22) [https://www.gnu.org/software/coreutils/manual/coreutils.html] :

So, the tail portion of my command equates to tail —follow —retry —lines=+0 , where the final argument directs it to start at the beginning, skipping zero lines.

Источник

How to ‘grep’ a continuous stream?

Is that possible to use grep on a continuous stream?

What I mean is sort of a tail -f command, but with grep on the output in order to keep only the lines that interest me.

I’ve tried tail -f | grep pattern but it seems that grep can only be executed once tail finishes, that is to say never.

12 Answers 12

Turn on grep ‘s line buffering mode when using BSD grep (FreeBSD, Mac OS X etc.)

It looks like a while ago —line-buffered didn’t matter for GNU grep (used on pretty much any Linux) as it flushed by default (YMMV for other Unix-likes such as SmartOS, AIX or QNX). However, as of November 2020, —line-buffered is needed (at least with GNU grep 3.5 in openSUSE, but it seems generally needed based on comments below).

I use the tail -f | grep

It will wait till grep flushes, not till it finishes (I’m using Ubuntu).

I think that your problem is that grep uses some output buffering. Try

it will set output buffering mode of grep to unbuffered.

If you want to find matches in the entire file (not just the tail), and you want it to sit and wait for any new matches, this works nicely:

The -c +0 flag says that the output should start 0 bytes ( -c ) from the beginning ( + ) of the file.

In most cases, you can tail -f /var/log/some.log |grep foo and it will work just fine.

If you need to use multiple greps on a running log file and you find that you get no output, you may need to stick the —line-buffered switch into your middle grep(s), like so:

you may consider this answer as enhancement .. usually I am using

-F is better in case of file rotate (-f will not work properly if file rotated)

-A and -B is useful to get lines just before and after the pattern occurrence .. these blocks will appeared between dashed line separators

But For me I prefer doing the following

this is very useful if you want to search inside streamed logs. I mean go back and forward and look deeply

Источник

Команда Tail в Linux

Linux Tail Command

В этом уроке мы покажем вам, как использовать хвостовую команду Linux, на практических примерах и подробных объяснениях наиболее распространенных опций хвоста.

Команда tail отображает последнюю часть (по умолчанию 10 строк) одного или нескольких файлов или переданных данных. Он также может быть использован для мониторинга изменений файла в режиме реального времени.

Читайте также:  Требования установки ос семейства windows

Одним из наиболее распространенных применений команды tail является просмотр и анализ журналов и других файлов, которые со временем меняются, обычно в сочетании с другими инструментами, такими как grep .

Синтаксис хвостовой команды

Прежде чем перейти к использованию команды tail, давайте начнем с рассмотрения основного синтаксиса.

Выражения команды tail принимают следующую форму:

  • OPTION — хвостовые варианты . Мы рассмотрим наиболее распространенные варианты в следующих разделах.
  • FILE — Ноль или более имен входных файлов. Если FILE не указан или если FILE установлен — , tail будет читать стандартный ввод.

Как использовать команду Tail

В простейшем виде, когда используется без какой-либо опции, команда tail отображает последние 10 строк.

Как отобразить определенное количество строк

Используйте опцию -n ( —lines ), чтобы указать количество отображаемых строк:

Вы также можете опустить букву n и использовать только дефис ( — ) и число (без пробелов между ними).

Для отображения последних 50 строк имени файла filename.txt вы должны использовать:

В следующем примере будет показан тот же результат, что и в приведенных выше командах:

Как отобразить определенное количество байтов

Для отображения определенного количества байтов используйте опцию -c ( —bytes ).

Например, для отображения последних 500 байтов данных из названного файла filename.txt вы должны использовать:

Вы также можете использовать суффикс множителя после числа, чтобы указать количество отображаемых байтов. b умножает его на 512, kB умножает на 1000, K умножает на 1024, MB умножает на 1000000, M умножает на 1048576 и т. д.

Следующая команда отобразит последние два килобайта (2048) файла filename.txt :

Как посмотреть файл на предмет изменений

Чтобы отслеживать файл на наличие изменений, используйте параметр -f ( —follow ):

Эта опция особенно полезна для мониторинга файлов журнала. Например, чтобы отобразить последние 10 строк /var/log/nginx/error.log файла и отслеживать файл на наличие обновлений, вы будете использовать:

Чтобы прервать команду tail во время просмотра файла, нажмите Ctrl+C .

Чтобы продолжить мониторинг файла при его воссоздании, используйте -F опцию.

Эта опция полезна в ситуациях, когда команда tail следит за вращающимся файлом журнала. При использовании с -F опцией команда tail снова откроет файл, как только он снова станет доступным.

Как отобразить несколько файлов

Если несколько файлов предоставлены в качестве входных данных для команды tail, она будет отображать последние десять строк из каждого файла.

Вы можете использовать те же параметры, что и при отображении одного файла.

Этот пример показывает последние 20 строк файлов filename1.txt и filename2.txt :

Как использовать хвост с другими командами

Команда tail может использоваться в сочетании с другими командами, перенаправляя стандартный вывод из / в другие утилиты, используя каналы.

Например, чтобы отслеживать файл журнала доступа apache и отображать только те строки, которые содержат IP-адрес, который 192.168.42.12 вы используете:

Следующая ps команда отобразит десятку запущенных процессов, отсортированных по загрузке процессора:

Вывод

К настоящему времени вы должны хорошо понимать, как использовать хвостовую команду Linux. Он дополняет команду head, которая печатает первые строки файла на терминал.

Источник

Оцените статью