Я пытаюсь увидеть, сколько раз foo bar
в /var/log/foo.log
течение произвольного промежутка времени появляется на удаленном сервере, но ничего из того, что я пробовал до сих пор, не сработало.
У меня уже есть сценарий таймера, который я использую для отслеживания того, сколько времени прошло с тех пор, как я начал хвастаться /var/log/foo.log
, и теперь я просто хотел бы узнать, сколько раз foo bar
появилось в хвостовом выводе.
Я искал в Google, но я не нашел ничего подходящего в первых 10 страницах результатов.
Вот что я пробовал с разочаровывающими результатами:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
Я даже пытался написать сценарий sed, который бы вел себя как tail -f
, но я сделал это с ограничением на успех.
НОТА
на удаленном сервере запущена более старая версия coreutils, и обновление является опцией, но никоим образом НЕ является желаемым решением.
источник
--line-buffered
вариантgrep
. Илиtail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Ответы:
работает для меня и является первым, о чем я подумал - это если вы действительно хотите, чтобы строки были пронумерованы от 1, а не от реального номера строки из просматриваемого файла. При необходимости добавьте,
grep
если необходимо, в соответствующее место (до или послеnl
). Однако помните, что буферизация может произойти. В моем конкретном случаеgrep
есть--line-buffered
опция, ноnl
она буферизует вывод и не имеет возможности отключить ее. Следовательно,tail | nl | grep
комбо не очень красиво.Это сказало,
у меня тоже работает. Нумерация начинается снова с начала «хвоста», а не с начала всего файла журнала.
источник
-n
опции.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
работает!Я думаю, что это лучше ..
источник
Вы также можете перенаправить вывод
less
, у него есть функция номера строки,-N
которая позволит вам прокручивать журнал назад и вперед.пример
ПРИМЕЧАНИЕ. Обратите внимание на вывод. Эта функция может вам понравиться, а может и не понравиться, но она займет длинные строки и нарежет их так, чтобы они продолжались на следующей строке, но сохраняли тот же соответствующий номер строки. Я считаю, что эта функция неоценима при анализе широких файлов журналов! Вы можете увидеть эффект этой функции в строках 6 и 8 .
источник
tail
. Что касается длинных строк, то это поведение переключается приless
использовании-S
.Чтобы отобразить новые строки только в файле журнала, так как они идут вместе с номером строки, вы можете сделать:
(с помощью
mawk
, вы захотите добавить-Winteractive
опцию, чтобы предотвратить ее входную (!) буферизацию).wc -l
читает строки , которые уже были там, и считает их (символы новой строки, что означает, что он все еще работает, даже если последняя строка еще не заполнена), а затем мыtail -f
остальное (начиная с того места, гдеwc
прекратили чтение) и сообщаем,awk
какой номер строки первый это видит.источник
l
качестве имени переменной заставил меня прищуриться на $ l, думая, что это$1
^^ (но, как я знаю (и на 100% доверяю) вам, я перечитал и увидел правду). Просто для любопытства: чтобы избежать некоторого «состояния гонки» междуwc -l
иtail -f
(если файл быстро растет, можно отбросить некоторые строки и, следовательно, NR начинается с неправильного числа), можно ли$l
вместо этого пропустить строки? (а какой предел для хвоста-n
в posix и в gnu?). Может быть, с временным промежуточным файлом?tail -n +1
(прочитайте что-нибудь из начальной позиции) решает проблемы состояния гонки. Он будет читать строки, которых не было в файле на моментwc -l
завершения, с точной позиции,wc
оставленной им. Таким образом, NR будет иметь правильную позицию независимо от того, сколько строк написано междуwc
окончанием иtail
началом. Если вы скажетеtail
начать с некоторой позиции относительно конца файла, у вас возникнут проблемы.tail -n +1
), для обычных файлов у большинства реализаций нет таковых, поскольку они могут начинаться с конца иseek
обратно, пока не найдут n-ную новую строку без необходимости хранить более одного значения buf данных в памяти. Для ввода без поиска, вот где вы можете столкнуться с ограничениями. POSIX требует, чтобы реализации могли хранить по крайней мере 10 х LINE_MAX байт (LINE_MAX по крайней мере 2048). У хвоста GNU нет никаких ограничений, кроме памяти AFAIKЕсли вы хотите начать нумерацию с самого начала, вам понадобится grep -n для применения ко всем строкам.
Если бы тогда вы хотели показать только последние 10, я бы подумал, что вы можете изменить файл:
Первый удобен, но показывает слишком много продукции. Я не знаю, почему второй не работает.
источник
tail -n +1 -f
хвост с самого начала.tail
не могут ничего выводить, пока не увидят последнюю строку своего ввода (как он узнает, какая десятая последняя строка?), Что никогда не произойдет, какtail -f
никогда не останавливается.Команда
cat -n [filename] | tail
быстро подсчитает и отобразит самые последние записи, если это то, что вы ищете.-f
Переключатель делает его стойким до побега - который на самом деле не звучит применимо в вашем сценарии или является излишним.wc -l [filename]
получит количество строк в целиwc -l [filenameprefix]*
будет подсчитывать все строки во всех файлах, соответствующих шаблону, и даже сообщать итоговую сумму в конце.Более полная информация может дать более полные ответы.
источник
Это аргумент
n
или--lines
(используется немного по-другому, см. Ниже):Смотрите также помощь:
источник