I megpróbálom megszámolni az adott program által kiadott kimeneti sorok számát. A probléma az, hogy Hosszú ideig tart a futtatása, és szeretném megjeleníteni a kimenetet a felhasználó számára. Van-e mód arra, hogy megszámoljuk az utoljára kiadott parancsok számát?
Megtehetném, hogy program | wc -l
, de ez nem fogja megmutatni a kimenetet a felhasználónak. Tehát amennyire tudom, meg kell tennem a következőt: program; program | wc -l
– de a program futtatása legalább egy percet vesz igénybe, ezért nem akarom, hogy csak egyszer kelljen megtenni hogy a sorok alul jelenjenek meg.
SZERKESZTÉS:
- Van-e mód arra, hogy megjelenítse a kimenetet, ahogy történik (soronként), majd visszaadja a számot a végén?
Megjegyzések
Válasz
A tee
segítségével feloszthatja a kimeneti adatfolyamot, egy példányt elküldve a wc
címre, és a másik példány a STDOUT-ra, mint a szokásos.
program | tee >(wc -l)
A >(cmd)
a bash szintaxis, ami ru n cmd
és cserélje le a >(cmd)
bitet a program STDIN-jének elérési útjára (egy elnevezett cső csatlakozik).
Megjegyzések
-
>(cmd)
ksh
szintaxist azsh
ésbash
és csak nevezett csöveket használ olyan rendszereken, amelyek nem ' t/dev/fd/n
. - @StephaneChazelas Igen, a legtöbb héj támogatja, de ' nincs benne POSIX, tehát ' nem lehet arra hivatkozni, hogy mindenhol jelen legyen.
- Igen, csak rámutattam, hogy a folyamat helyettesítése nem
bash
találmány, mivel a válaszban szereplő szöveg megengedheti az embernek, hogy higgyen benne. - @TheLibbster Attól függ, hogyan definiálja hatékonyan. Ez a módszer 2 további folyamat ívásával jár, ahol
sed
ésawk
csak egy. Detee
éswc
egyaránt rendkívül kicsi (sokkal kisebb, mint ased
és aawk
). - @TheLibbster igen, néhány egyszerű teszt szerint, amit most végeztem, ' valójában kb. Kétszer olyan gyorsan mint a
sed
és aawk
módszereket. (Idd
d 100mb/dev/urandom
fájlt egy fájlba, majd ezt a fájlt többször is futtattam az egyes módszereken)
Válasz
Az egyik lehetőség az awk használata, amely elvégzi a számlálást és a stdout-ra nyomtatást.
program | awk "{ print } END { print NR }"
A awk
mezőben az NR az aktuális sorszám. Ugyanezt megteheti a perl segítségével:
program | perl -pe "END {print "$.\n"}"
Vagy sed
:
program | sed -n "p;$="
Megjegyzések
- Van-e mód arra, hogy megjelenítse a kimenetet, ahogy történik (soronként), majd visszaadja a számot a végén ?
Válasz
kedvenc lehetőségem:
program | grep "" -c
Megjegyzések
- Lehet, hogy az OP valami mást kért, de azért jöttem ide, hogy csak kimenő sorszámot kapjak, és nem tudtam ' nem érdekli a tényleges kimenet megjelenítése, és ez elvégzi a munkát. Köszönöm!
Válasz
Az stdout klónozható a stderr-en.
program | tee /dev/stderr | wc -l
Így program
” stdout a tee
fájlba kerül, amelyet a stderr-be kell írni, amely kinyomtatva a konzolra. tee
a hozzá csatolt adatokat a stdout-ba is írja, amelyet a wc
címre továbbítanak.
Válasz
Ez későn járhat. De csak a későbbi kérdésével foglalkoznék azzal kapcsolatban, hogy hogyan lehet elkapni a megszámlált számot egy változóban.
Erre vágyik YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.
Kihasználjuk a tee
két adatfolyamot itt, és az egyiket irányítsa a /dev/stderr
címre, amely megjelenik a képernyőn, a másikat pedig a wc -l
címre, amely a sorok számát jelentené.
Válasz
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
), vagy naplózza egy fájlba / API-ba a program végén. WDYT?