Я знаю конечно что
cat logfile.txt | wc -l
120
скажет мне количество строк в файле.
В то время как
tail -f logfile.txt
покажет мне новые строки, в которые пишет другая программа logfile.txt
.
Можно ли объединить оба, так что я получаю непрерывное обновление строки счетчика logfile.txt со стандартными текстовыми утилитами?
Я знаю о
watch wc -l logfile.txt
но я не хочу пересчитывать весь файл каждый раз, это кажется пустой тратой. Каждую секунду или около того потребуется счетчик только с добавлением и, возможно, \r
вместо \n
конца строки.
cat
выпуск продукции в трубопроводwc
также является большой тратой !!Ответы:
Может быть:
Остерегайтесь того, что он будет выводить число для каждой строки ввода (хотя переопределяет предыдущее значение, если отправлено на терминал).
Или вы можете реализовать это
tail -f
вручную в оболочке:(обратите внимание, что она выполняет до одной
wc
и однойsleep
команды в секунду, которую встроили не все оболочки. С помощью встроенногоksh93
whilesleep
для получения встроенногоwc
(по крайней мере, в Debian), вы должны добавить/opt/ast/bin
перед$PATH
(независимо от того, этот каталог существует или нет) или использоватьcommand /opt/ast/bin/wc
(не спрашивайте ...)).Вы можете использовать
pv
, как в:Но нужно учитывать , что он добавляет
k
,M
... суффиксы , когда число превышает 1000 (и там , кажется, не быть способ вокруг этого ).источник
tail | awk
решению. Знайте свои варианты:-n +0
не пришло бы мне в голову в этой комбинации.pv
- еще один полезный новый инструмент. огромное спасибо.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
это расширенный наборgrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
чтобы сделатьawk
печать новой строки в конце.Попробуйте посчитать с чистым
bash
безwc
:или даже так, чтобы переписать предыдущее значение:
источник
Я не верю, что есть что-то подобное. Но это должно быть легко сделать что-то вроде:
(Общая идея извлечена из
perlfunc(1)
)источник
printf foo >> file
. Вам нужно будет посчитать символы новой строки (какwc -l
в предложенном мною решении оболочки), а не записи, возвращаемые<$fh>
. Я не думаю, что вам нужно использоватьtell
илиseek
вообще.<$fh>
умолчанию читает строку, а не записи. Упомянутая man-страница Perl говорит, что делать это таким образом ради возможного отказа от сотрудничества (может зависеть от файловой системы, я думаю, NFS или другие сетевые файловые системы могут потребовать немного подталкивания).<$fh>
вернете запись, даже если она не завершается символом перевода строки. Так что, если онperl
находится в конце файла, а кто-то позже делаетprintf foo >> file
, то<$fh>
вернетсяfoo
(не строка, поскольку она не заканчивается символом новой строки), и$count
будет увеличен, даже если в файл не было добавлено никакой дополнительной строки.Продолжаем решение на основе awk: вам может не понадобиться видеть тикающий счетчик для каждой строки в вашем журнале; в этом случае вы можете получить его следующим образом (число будет меняться для каждых 10 строк):
источник