Я пытаюсь посчитать количество строк вывода, которые производит определенная программа. Проблема в том, что программе требуется много времени для запуска, и я хочу показать вывод пользователю. Есть ли способ подсчитать количество строк последней команды?
Я мог бы сделать, program | wc -l
но это не показывало бы вывод пользователю. Так что, насколько я знаю, мне нужно сделать program; program | wc -l
- но запуск программы занимает не менее минуты, поэтому я не хочу делать это более одного раза, чтобы показать количество строк внизу.
РЕДАКТИРОВАТЬ:
- Есть ли способ показать вывод, как это происходит (строка за строкой), а затем вернуть счет в конце?
bash
shell
debian
command-line
Libbux
источник
источник
STDOUT_WRITE_COUNT
), или записывала его в файл / API в конце программы. WDYT?Ответы:
Вы можете использовать,
tee
чтобы разделить выходной поток, отправляя одну копиюwc
в другую, а другую - в STDOUT, как обычно.>(cmd)
Является Баш синтаксиса , который означает запуститьcmd
и заменить>(cmd)
бит с путем (именованный канал , подключенный к) STDIN этой программы.источник
>(cmd)
имеетksh
синтаксис также признаетсяzsh
иbash
и только с использованием именованных каналов в системах , которые не имеют/dev/fd/n
.bash
изобретением, так как формулировка в вашем ответе позволила бы верить.sed
иawk
только один. Ноtee
иwc
оба они чрезвычайно малы (намного меньше, чемsed
иawk
).sed
иawk
методы, и методы. (Яdd
записал 100 МБ/dev/urandom
в файл, а затем несколько раз прогонял этот файл через каждый метод)Одним из вариантов является использование awk, который может выполнять подсчет и выводить на стандартный вывод.
В
awk
, NR - текущий номер строки. Вы можете сделать то же самое с Perl:Или
sed
:источник
Вы можете клонировать стандартный вывод на стандартный вывод.
Таким образом,
program
stdout направляетсяtee
для записи в stderr, который выводится на консоль.tee
также записывает данные, передаваемые по каналу, в свой стандартный вывод, который передается по каналуwc
.источник
мой любимый вариант:
источник
источник
Это может быть поздно. Но я бы просто ответил на ваш вопрос о том, как поймать подсчитанное число в переменной.
Это то, что вы хотите
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Мы используем
tee
здесь два потока и направляем один из них/dev/stderr
, который будет отображаться на экране, а другой - вwc -l
отчет о количестве строк.источник