Snažím se spočítat počet řádků výstupu, které určitý program produkuje. Problém je v tom, že program spuštění trvá dlouho a chci uživateli zobrazit výstup. Existuje způsob, jak spočítat počet řádků, které vydal poslední příkaz?
Nemohu udělat program | wc -l, ale to by uživateli neukazovalo výstup. Pokud vím, musím udělat program; program | wc -l – ale spuštění programu trvá minimálně minutu, takže to nechci dělat víc než jednou v dolní části se zobrazí počet řádků.
EDIT:
- Existuje způsob, jak zobrazit výstup tak, jak se to stane (řádek po řádku), a poté na konci vrátit počet?
Komentáře
Odpovědět
Pomocí tee můžete rozdělit výstupní proud a odeslat jednu kopii na wc a druhá kopie do STDOUT jako normální.
program | tee >(wc -l)
>(cmd) je bash syntax, což znamená ru n cmd a bit >(cmd) nahraďte cestou k (pojmenovanému kanálu připojenému k) programu STDIN.
Komentáře
-
>(cmd)jekshsyntaxe také rozpoznánazshabasha používá pouze pojmenované kanály v systémech, které <
nemá /dev/fd/n.
bash vynález, protože formulace ve vaší odpovědi by mohla člověku uvěřit. sed a awk jsou jen jeden. Ale tee a wc jsou oba extrémně malé (mnohem menší než sed a awk). sed i awk. (dd d 100 mb /dev/urandom do souboru a poté tento soubor několikrát spustit každou metodou) Odpověď
Jednou z možností je použití awk, které dokáže počítat a tisknout na standardní výstup.
program | awk "{ print } END { print NR }"
V awk je NR číslo aktuální linky. Totéž můžete dosáhnout pomocí perl:
program | perl -pe "END {print "$.\n"}"
Nebo sed:
program | sed -n "p;$="
Komentáře
- Existuje způsob, jak zobrazit výstup tak, jak k němu dojde (řádek po řádku) a poté na konci vrátit počet ?
Odpověď
moje oblíbená možnost:
program | grep "" -c
Komentáře
- OP se možná zeptal na něco jiného, ale přišel jsem sem a hledal jen počet výstupů z počtu řádků a ne ' se nestará o zobrazení skutečného výstupu, a toto dělá svou práci. Děkujeme!
Odpověď
Stdout můžete klonovat na stderr.
program | tee /dev/stderr | wc -l
Tímto způsobem se program“ stdout přesměruje na tee, který se zapíše do stderr, což je vytištěno na konzole. tee také zapíše data, která jsou k němu připojena, do svého standardního výstupu, který je odeslán do wc.
Odpověď
Může to být pozdě. Chtěl bych se ale jen zabývat vaší následnou otázkou, jak zachytit spočítané číslo v proměnné.
To je to, co chcete YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l).
Využíváme výhod tee generování dvou proudů zde a nasměrujte jeden na /dev/stderr, který se zobrazí na vaší obrazovce, a druhý na wc -l, který ohlásí počet řádků.
Odpověď
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)
STDOUT_WRITE_COUNT) nebo jej přihlaste do souboru / API na konci programu. WDYT?