Önceki programdan gelen çıktı satır sayısını say


32

Belirli bir programın ürettiği çıktı satır sayısını saymaya çalışıyorum. Sorun şu ki, programın çalışması çok uzun sürüyor ve çıktıyı kullanıcıya göstermek istiyorum. Çıktılan son komutun satır sayısını saymanın bir yolu var mı?

Yapabilirim program | wc -lama bu kullanıcıya çıktı göstermezdi. Bildiğim kadarıyla yapmak zorundayım program; program | wc -l- ancak programın çalışması en az bir dakika sürüyor, bu yüzden en altta satır sayısını göstermek için bir kereden fazla yapmak istemiyorum.

DÜZENLE:

  • Çıktıyı olduğu gibi göstermenin (satır satır) ve sonunda bir sayı döndürmenin bir yolu var mı?

Şunlar hakkında: programın kendi çıktısını izlemesini sağlayın ve bu değeri değişkenden (örn. STDOUT_WRITE_COUNT) Okuyun veya programın sonunda bir dosyaya / API'ye kaydedin. WDYT?
mecampbellsoup

Yanıtlar:


43

teeBir kopyasını gönderen çıktı akışını wcve diğer kopyasını STDOUT'a normal şekilde göndermek için kullanabilirsiniz .

program | tee >(wc -l)

>(cmd)Aracı çalıştırmak Bash sözdizimi cmdve yerine >(cmd)(bağlı adlandırılmış boru) o programın stdin'e yolu ile bit.


2
>(cmd)olduğu kshda tanınan söz dizimi zshve bashsadece kullanan adlandırılmış boruları yok sistemlerde /dev/fd/n.
Stéphane Chazelas,

@StephaneChazelas Evet, çoğu kabuk desteklemektedir, ancak POSIX'de değildir, bu nedenle her yerde olduğu için güvenilmez.
Patrick,

Evet, sadece bashcevabınızdaki ifadelerin birisinin inanmasına izin verebileceği için işlem değişikliğinin bir icat olmadığını söylüyordum.
Stéphane Chazelas

1
@TheLibbster Etkili şekilde nasıl tanımladığınıza bağlı. Bu yöntem, olduğu gibi sedve awksadece bir tanesi olan 2 ek işlemin oluşturulmasını içerir . Ama teeve wcher ikisi (çok daha küçük, son derece küçüktür sedve awk).
Patrick

1
@TheLibbster evet, sadece yaptım bazı basit testlere göre, her iki kadar hızlı hakkında iki kez aslında sedve awkyöntemlerle. ( Bir dosyaya 100 ddMB /dev/urandomveriyorum ve daha sonra bu dosyayı her yöntemde birkaç kez çalıştırmıştım)
Patrick

10

Bir seçenek de, sayımı yapabilen ve stdout'a basabilen awk kullanmaktır.

program | awk '{ print } END { print NR }'

Olarak awk, NR geçerli satır numarasıdır. Perl ile aynı şeyi yapabilirsiniz:

program | perl -pe 'END {print "$.\n"}'

Veya sed:

program | sed -n 'p;$='

Çıktıyı olduğu gibi göstermenin (satır satır) ve sonunda bir sayı döndürmenin bir yolu var mı?
Libbux

6

Stderout'ta stdout'u klonlayabilirsiniz.

program | tee /dev/stderr | wc -l

Bu şekilde, programstdout teekonsoluna basılmış olan stderr'ye yazılmak üzere gönderilir. teeayrıca, kendisine iletilen verileri, yönlendirildiği stdout'una yazar wc.


3

en sevdiğim seçenek:

program | grep "" -c

1
OP başka bir şey sormuş olabilir, ancak buraya sadece bir dizi satır çıktısı almak için geldim ve gerçek çıktının gösterilmesiyle ilgilenmiyordum ve bu işi yapıyor. Teşekkürler!
Nikhil VJ

0
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)

0

Bu geç olabilir. Fakat sayılan sayının bir değişkende nasıl yakalanacağı konusundaki takip sorunuza sadece değineceğim.

Senin istediğin bu YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l) .

Burada teeiki akış oluşturmanın avantajını kullanıyoruz ve bunlardan birini /dev/stderrekranda belirecek, diğeri wc -lise satır sayısını bildirecek şekilde yönlendiriyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.