Ayrı parçalar çalışır, ancak içlerinden veri aktarımı onu kırar


2

Kısacası: ping için başka bir çıktı oluşturmaya çalışıyorum, bu yapmaya çalıştığım bazı şeyler için daha iyi sonuç veriyor. Bunun için, ping çıktısını sed'e çeviriyorum, her şeyi çıkarmak için harcadığı milisaniye dışında. Son bölüm python ile yazılmıştır ve çıktıyı oluşturur. İşte kod:

ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' | python3 -c 'while True:
    l = [float(input()) for _ in range(10)]
    m = sum(l) / len(l)
    n = sum(abs(i - m) for i in l) / len(l)
    print("{}\t{}".format(m, n))'

Onu balıkta ve balıkta çalıştırmaya çalıştım ve işe yaramadı (=> Çıktı alamadım). Bununla birlikte, tek tek parçalar çalışır ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//', beklenen çıktıyı verir. Bir dosyayı içine aktarmak için cat kullanırsam python betiği beklenen çıktıyı verir.


@ John1024 Ortalama ve ortalama sapmayı, arada bir sekmeyle birlikte verir. Ama bu gerçekten önemli değil. cmd1 | cmd2 > fardından cat f | cmd3eşdeğer olmalıdır cmd1 | cmd2 | cmd3. (Çıktılar arasındaki gecikmeyle) Ancak bu durumda, nedense bilmiyorum.
CodenameLambda

@ John1024 Çıktı alamadım. Soruyu güncelleyeceğim.
CodenameLambda

Yanıtlar:


3

Her zaman olduğu gibi, böyle bir davranış gözlendiğinde (çıkış veya gecikmeli çıkış yok), bunun nedeni boru hattı tamponlamasıdır. Bayrağınızla sed"tamponlanmamış" olduğunuzu söylerseniz emriniz burada çalışır -u.

Sen bireysel programların tamponlama davranışını değiştirebilir stdbufgelen programda coreutilsmesela hat arabelleğe kullanmak,:

stdbuf -oL sed '...'

Bu arada, sürümünüz grepPerl düzenli ifadelerini destekliyorsa, aynı efekti bir gözetleme modeliyle elde edebilirsiniz, örneğin:

grep --line-buffered -oP '[0-9.]+(?= ms)'

Özellikle sağladığınız grepseçeneği seviyorum , ancak Perl regex desteğim yok. Yine de kullanabilirsiniz grep:, grep --line-buffered -oE '[0-9.]+ ms' | grep --line-buffered -oE '[0-9.]+'ancak sedyalnızca bir arama.
CodenameLambda
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.