Другой инструмент, доступный на 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))
Использование GNU tail
и GNU grep
, Я могу к grep a tail -f
использование простого синтаксиса:
tail -f /var/log/file.log | grep search_term
Это будет хорошо работать; в более общем плане, grep
будет ожидать, когда программа не производит, и продолжайте читать, поскольку вывод входит, поэтому если Вы делаете:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Ничего не произойдет в течение 5 секунд, затем grep произведет подобранный "тест", и затем пять секунд спустя он выйдет, когда переданный по каналу процесс сделает
Можно просто передать вывод по каналу grep
в tail -f
. Существуют также программы то объединение tail -f
функциональность с фильтрацией и окраской, в особенности мультихвост (примеры).
tail -f access | awk '/ADD/{print $0}'
Используйте вышеупомянутое, я обычно использую его.
Можно использовать 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 для каждого из двух наборов команд или использовать что-то как экран.
Работает. Но заботьтесь, которые производят, больше не мгновенно: это буферизуется через канал.
tail -f
в одном окне, и tail -f logfile | grep pattern
в другом окне. Строки, содержащие pattern
не всегда появляйтесь в обоих окнах одновременно. Я видел, что строки кажутся на расстоянии в 30 секунд в редких случаях, который был раздражающим.
– Stefan Lasiewski
19.10.2010, 22:46
tee
или что-то.
– Kevin Cantu
20.10.2010, 01:08
Добавить --line-buffered
кому: grep
, и это может уменьшить задержку Вас. Очень полезный в некоторых случаях.
tail -f foo | grep --line-buffered bar
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
, где последний аргумент указывает начать с самого начала, пропуская нулевые строки.