grep и хвост-f?

Другой инструмент, доступный на Linux, является ss. Из ss страницы справочника на Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

Вывод в качестве примера ниже - последний столбец показывает привязку процесса:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))
30
15.05.2011, 16:02
8 ответов

Использование GNU tail и GNU grep, Я могу к grep a tail -f использование простого синтаксиса:

tail -f /var/log/file.log | grep search_term
48
27.01.2020, 19:38
  • 1
    Это - решение, которое работает с другими реализациями этих двух утилит, не только реализацией GNU. –  Kusalananda♦ 15.02.2017, 21:02

Это будет хорошо работать; в более общем плане, grep будет ожидать, когда программа не производит, и продолжайте читать, поскольку вывод входит, поэтому если Вы делаете:

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

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

7
27.01.2020, 19:38

Можно просто передать вывод по каналу grep в tail -f. Существуют также программы то объединение tail -f функциональность с фильтрацией и окраской, в особенности мультихвост (примеры).

3
27.01.2020, 19:38
tail -f access | awk '/ADD/{print $0}'

Используйте вышеупомянутое, я обычно использую его.

1
27.01.2020, 19:38

Можно использовать netcat для grep результаты хвоста-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
27.01.2020, 19:38

Работает. Но заботьтесь, которые производят, больше не мгновенно: это буферизуется через канал.

0
27.01.2020, 19:38
  • 1
    . Для тестирования этого откройте два окна. Выполненный tail -f в одном окне, и tail -f logfile | grep pattern в другом окне. Строки, содержащие pattern не всегда появляйтесь в обоих окнах одновременно. Я видел, что строки кажутся на расстоянии в 30 секунд в редких случаях, который был раздражающим. –  Stefan Lasiewski 19.10.2010, 22:46
  • 2
    Это могло бы больше иметь отношение к системному зеркальному отражению между выполнением того или другого экземпляра хвоста. Лучший тест был бы нас tee или что-то. –  Kevin Cantu 20.10.2010, 01:08

Добавить --line-buffered кому: grep, и это может уменьшить задержку Вас. Очень полезный в некоторых случаях.

tail -f foo | grep --line-buffered bar
7
27.01.2020, 19:38
  • 1
    Это полезно когда вывод grep не переходит к терминалу (перенаправленный к другому типу файла). буферизация строки является значением по умолчанию, когда вывод переходит к терминалу, таким образом, это не будет иметь никакого значения там. Обратите внимание, что той опцией является конкретный GNU. –  Stéphane Chazelas 13.02.2014, 16:16

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

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

Это предполагает использование GNU tail и grep. Вспомогательные детали из manpage tail (GNU coreutils, моя версия 8.22) [https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F то же самое, что --follow=name --retry
 -n, --lines=K
 выводить последние K строк, вместо последних 10; или использовать -n +K для вывода
 начиная с K-й.
 Если первый символ K (количество байт или строк)
 является '+', выведите, начиная с K-го элемента от начала
 каждого файла, в противном случае выведите последние K элементов в файле.
 K может иметь суффикс множителя: b 512, kB 1000, K 1024, MB
 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
 и так далее для T, P, E, Z, Y.

 С параметром --follow (-f), tail по умолчанию следует за дескриптором файла,
 это означает, что даже если файл tail'ed будет переименован, tail
 будет продолжать отслеживать его конец. Такое поведение по умолчанию нежелательно
 когда вы действительно хотите отслеживать фактическое имя файла, а не
 дескриптор файла (например, ротация журнала). В этом случае используйте --follow=name
 в этом случае. Это заставит tail отслеживать именованный файл таким образом, чтобы
 учитывает переименование, удаление и создание.

Таким образом, часть моей команды tail равна tail --follow --retry --lines=+0, где последний аргумент указывает начать с самого начала, пропуская нулевые строки.

4
27.01.2020, 19:38

Теги

Похожие вопросы