Számolja meg az előző program kimenetének sorait.

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

  • Mi a helyzet: a program kövesse nyomon a saját kimenetét, és csak olvassa ki ezt az értéket a változóból (pl. STDOUT_WRITE_COUNT), vagy naplózza egy fájlba / API-ba a program végén. WDYT?

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 a zsh és bash é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 és awk csak egy. De tee és wc egyaránt rendkívül kicsi (sokkal kisebb, mint a sed és a awk).
  • @TheLibbster igen, néhány egyszerű teszt szerint, amit most végeztem, ' valójában kb. Kétszer olyan gyorsan mint a sed és a awk módszereket. (I dd 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) 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük