Próbuję policzyć liczbę wierszy danych wyjściowych, które wytwarza dany program. Problem polega na tym, że uruchomienie programu zajmuje dużo czasu i chcę wyświetlić dane wyjściowe użytkownikowi. Czy istnieje sposób na policzenie liczby wierszy wypisanych przez ostatnie polecenie?
Mógłbym to zrobić, program | wc -l
ale to nie pokazałoby wyjścia użytkownikowi. O ile wiem, muszę to zrobić program; program | wc -l
- ale uruchomienie programu zajmuje co najmniej minutę, więc nie chcę tego robić więcej niż jeden raz, aby wyświetlić liczbę wierszy na dole.
EDYTOWAĆ:
- Czy istnieje sposób na pokazanie wyniku w postaci, w jakiej się on odbywa (linia po linii), a następnie zwrócenie liczby na końcu?
bash
shell
debian
command-line
Libbux
źródło
źródło
STDOUT_WRITE_COUNT
) Lub rejestruje ją w pliku / interfejsie API na końcu programu. WDYT?Odpowiedzi:
Możesz użyć
tee
do podzielenia strumienia wyjściowego, wysyłając jedną kopię do,wc
a drugą kopię do STDOUT jak zwykle.Jest
>(cmd)
to składnia bash, która oznacza uruchomieniecmd
i zastąpienie>(cmd)
bitu ścieżką do (nazwanego potoku podłączonego) STDIN tego programu.źródło
>(cmd)
jestksh
również składnia rozpoznawana przezzsh
ibash
używa nazwanych potoków w systemach, które nie mają/dev/fd/n
.bash
wynalazkiem, ponieważ sformułowanie w twojej odpowiedzi mogło pozwolić uwierzyć.sed
iawk
są tylko jednym. Aletee
iwc
oba są bardzo małe (znacznie mniejsze niżsed
iawk
).sed
iawk
. (dd
Dodałem 100mb/dev/urandom
do pliku, a następnie kilkakrotnie uruchomiłem ten plik za pomocą każdej metody)Jedną z opcji jest użycie awk, który może wykonać liczenie i wydrukować na standardowe wyjście.
W
awk
, NR to bieżący numer linii. Możesz to zrobić za pomocą perla:Lub
sed
:źródło
Możesz sklonować stdout na stderr.
W ten sposób
program
wyjście standardowe jesttee
zapisywane na stderr, który jest wydrukowany na konsoli.tee
zapisuje także dane przesyłane do niego na standardowe wyjście, do którego jest przesyłanewc
.źródło
moja ulubiona opcja:
źródło
źródło
To może być późno. Chciałbym jednak odpowiedzieć na twoje pytanie uzupełniające, jak złapać zliczoną liczbę w zmiennej.
To jest to czego chcesz
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Korzystamy z
tee
generowania tutaj dwóch strumieni i kierujemy jeden do/dev/stderr
, który pojawi się na ekranie, a drugi dowc -l
, który zgłosi liczbę linii.źródło