Как отобразить количество строк, произведенных командой в режиме реального времени?

Вы вышли из системы и вошли в снова, так как Вы были добавлены к группе A?

В противном случае Ваши текущие процессы входа в систему будут только иметь составы группы, которые это имело во время входа в систему, не любых изменений с тех пор. И любые дочерние процессы того входа в систему будут иметь те же составы группы (т.е. если Вы вошли в X затем каждых приложений включая свой эмулятор терминала и оболочку),

Можно протестировать это путем входа в систему снова на другой консоли или через ssh или что-то как exec sudo -u $(id -u -n) -i (чтобы эффективно уничтожить и заменить текущую оболочку новой оболочкой - любые фоновые процессы, принадлежащие той оболочке, будут осиротевшими),

15
07.10.2013, 00:00
3 ответа

Это - общее представление, но Вы могли использовать pv управляйте для подсчета количества строк, поскольку они проходят и дисплей это на экран. pv среди он - много переключателей, имеет a -l переключатель, который считает каждую строку, как это проходит.

Пример

Здесь я использую некоторое время цикл для моделирования некоторых файлов от вывода SVN.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

Это будет продолжать перезаписывать выходную строку как это:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]
7
27.01.2020, 19:49
  • 1
    я не знал об объеме плазмы. Ура для изучения материала! –  dannysauer 06.10.2013, 22:16
  • 2
    @dannysauer - объем плазмы стоит провести некоторое время, учась, он позволяет что-либо, что проходит канал, который будет измерен и отображен. –  slm♦ 06.10.2013, 22:55
  • 3
    я установил его после того, как я прочитал комментарий и играл с ним. Восемнадцать лет с помощью Linux, и существуют все еще всегда новый материал для обнаружения. :) –  dannysauer 06.10.2013, 23:07
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

Или помещенный раздел на кронштейнах в сценарий оболочки. Обратите внимание, что это только работает, если Ваша оболочка на самом деле поддерживает преинкрементный оператор, как удар или ksh93 или zsh. Иначе необходимо будет увеличить $I и затем распечатайте его (как в I=$((I+1));printf...). Кроме того, если printf не встроенное с Вашей оболочкой (это - встроенное с текущим ударом), Вы могли использовать echo -ne или print -n вместо этого для лучшей производительности. Вы просто хотите подавить новую строку и интерпретировать \r как символ ESC.

16
27.01.2020, 19:49
  • 1
    О, я никогда не буду заставлять меня изучить bashscripting со всеми его ужасное = и '=' различия и причуды.:) Почему не был бы они заменять его python-like-syntaxed языком... –  Boris Burkov 06.10.2013, 21:12
  • 2
    Эй, я знаю, что! Можно добавить символ возврата каретки к каждой новой строке, которую Вы печатаете, и это не лавинно разошлет экран, это просто перезапишет предыдущую строку. –  Boris Burkov 06.10.2013, 21:22
  • 3
    Вот почему printf концы с a \r. И что происходит, если Вы делаете echo -ne "$I\r" или print -n "$I\r".:) Я использовал printf, однако, потому что это принимает значение по умолчанию к не печати новой строки в конце, таким образом, \r просто пятится к началу. Не все реализации эха поддерживают -e или -n аргумент, к сожалению. –  dannysauer 06.10.2013, 22:02
  • 4
    Это также работает с pdksh версией, которую OpenBSD использует для/bin/sh. хороший –  kurtm 06.10.2013, 22:06
  • 5
    +1, хотя быть абсолютно корректными, необходимо измениться read кому: read -r (так как иначе обратная косая черта в конце строки смешала бы с подсчетом). Кстати, с небольшим количеством работы, это может быть адаптировано, чтобы также показать последнюю строку вывода, который может быть полезен для некоторых команд. –  ruakh 07.10.2013, 04:10

Можно выполнить команду в фоне как задание и перенаправить его stdout (и stderr дополнительно) к файлу журнала: command > logfile & где & определяет задание (если stderr также, говорят &> вместо >).

Затем можно использовать wordcount утилиту для подсчета количества строк в файле журнала с wc -l.

Для показа изменения состояния в одной динамично изменяющейся строке Вы могли использовать что-то как while true; do echo -en '\r'; wc -l logfile; sleep 1; done, но я не могу вынудить удар потянуть \r возврат каретки для уничтожения содержания предыдущей строки.

Посмотрите этот вопрос, это - почти дубликат: https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

0
27.01.2020, 19:49
  • 1
    Но он хочет отображение в режиме реального времени, которое продолжает увеличивать, который не является тем, что делает туалет. –  kurtm 06.10.2013, 21:12
  • 2
    @kurtm а, что он хочет намного больше, не должен был лавинно рассылать его экран с результатами printf/print/echo как предложено danny.:) Конечно, он мог использовать less, но я предполагаю, он может позволить себе сказать wc -l logfile каждый раз он беспокоится. Я думаю, играя с ncurses или очистка экрана является излишеством здесь. –  Boris Burkov 06.10.2013, 21:18
  • 3
    Ну, да. Он не хочет лавинно рассылаемый, но он хочет знать прогресс, иначе он мог просто использовать - тихий. –  kurtm 06.10.2013, 21:32
  • 4
    @kurtm видят обновление: можно ли помочь отладить мой echo -e 'r' команда? Это должно стереть ранее печатное содержание строки, так, чтобы это динамично изменилось, но я не могу вынудить это сделать тот :( –  Boris Burkov 06.10.2013, 21:35
  • 5
    , который Вы хотите также добавить n опцию повторить, который подавляет запаздывающую новую строку. –  kurtm 06.10.2013, 21:39

Теги

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