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)kshszintaxist 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
bashtalá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ésawkcsak egy. Deteeéswcegyará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 aawkmódszereket. (Iddd 100mb/dev/urandomfá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?