Подсчитайте количество строк из предыдущей программы

Я пытаюсь подсчитать количество строк вывода, созданных определенной программой. Проблема в том, что программа занимает много времени, и я хочу отобразить вывод для пользователя. Есть ли способ подсчитать количество строк, выведенных последней командой?

Я мог бы сделать program | wc -l, но это не отображало бы результат для пользователя. Так что, насколько я знаю, мне нужно сделать program; program | wc -l - но для выполнения этой программы требуется не менее минуты, поэтому я не хотите сделать это более одного раза, чтобы показать количество строк внизу.

EDIT:

  • Есть ли способ показать результат, как это происходит (строка за строкой), а затем вернуть счет в конце?
28 голосов | спросил Libbux 18 AMpThu, 18 Apr 2013 02:08:00 +040008Thursday 2013, 02:08:00

6 ответов


34

Вы можете использовать tee, чтобы разделить поток, отправляющий одну копию, на wc, а другая - в STDOUT, как обычно.

program | tee >(wc -l)

>(cmd) - это синтаксис bash, который означает run cmd и замените бит >(cmd) на путь к (именованный канал, подключенный к) для этой STDIN программы.

ответил Patrick 18 AMpThu, 18 Apr 2013 02:22:56 +040022Thursday 2013, 02:22:56
9

Один из вариантов заключается в использовании awk, который может выполнять подсчет и печать в стандартный вывод.

program | awk '{ print } END { print NR }'

В awk, NR - номер текущей строки. Вы можете сделать то же самое с perl:

program | perl -pe 'END {print "$.\n"}'

Или sed:

program | sed -n 'p;$='
ответил jordanm 18 AMpThu, 18 Apr 2013 02:18:33 +040018Thursday 2013, 02:18:33
4

Вы можете клонировать stdout на stderr.

program | tee /dev/stderr | wc -l

Таким образом, stdout program отправляется на tee, который будет записан в stderr, который печатается на консоли. tee также записывает данные, переданные по нему на его стандартный вывод, который передается по каналу на wc.

ответил Smith John 18 AMpThu, 18 Apr 2013 02:38:22 +040038Thursday 2013, 02:38:22
1

мой любимый вариант:

program | grep "" -c
ответил montells 16 Maypm18 2018, 22:47:29
0
tail -f /var/log/squid/access.log | ( c=0; pl() { echo $c; c=0; }; trap pl SIGHUP; while read a; do (( c=c+1 )); done ) & ( trap 'kill $! ; exit' SIGINT; trap '' SIGHUP; while true; do kill -HUP $! ; sleep 1; done)
ответил zlob 31 PM00000030000001831 2015, 15:19:18
0

Возможно, это будет поздно. Но я бы просто рассмотрел ваш следующий вопрос о том, как уловить подсчитанное число в переменной.

Это то, что вы хотите YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l).

Мы используем tee генерируем два потока здесь и нажимаем на /dev/stderr, который появится на вашем экране, а другой - на wc -l, который будет сообщать количество линии.

ответил huangzonghao 29 Maypm18 2018, 23:52:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132