Linux çıkış yönlendirmesi awk ile çalışmıyor


0

Yukarıdan gelen bazı çıktılara dayanarak güzel bir csv dosyası yazmaya çalışıyorum. Çıkışı şöyle awk ile yeniden biçimlendiririm:

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

Bu mükemmel çalışıyor. Şimdi çıktıyı bir dosyaya kaydetmek istiyorum. Kullanmanın > output.logişe yaraması gerektiğini düşünüyorum.

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

Ancak, bu işlem en üst işlemden Ctrl-C çıktığında boş bir dosyayla sonuçlanır. Neyi yanlış yapıyorum?

Yanıtlar:


1

Unix'in standart I / O (“stdio”) kütüphanesi, ne tür bir şeye (veri havuzu) yazdığını tespit eder. Bir terminali (yani bir pencereyi) algılarsa, program istediğinde derhal veriyi yazar. Ancak, bir dosyaya yazarken, G / Ç kitaplığı verileri arabelleğe alır ve bir seferde 512 (veya daha fazla) baytlık bloklar halinde yazar. Tabii ki, çağıran program çıktığında tamponu temizler (kısmi bir blok yazarak) - temiz bir şekilde çıkarsa. Anormal bir sonlandırma ( Ctrl+ nedeniyle C), eksik bir çıktı dosyası bırakabilir.

Düzeltmek için deneyin:

top -b | ( trap "" 2; nawk '( nawkemriniz) `' > output.log)

trapKomut yapacak nawkkomut bağışık Ctrl+ C. (Elbette Ctrl+ Chala topsüreci öldürecek nawkve borudaki dosyanın sonuna geldiğinde (temiz!) Sonlanacaktır.

Not: Bu, koşmakta olduğunuz bashveya bashuyumlu bir kabuk olduğunu varsaymaktadır (gerektirir) .


0

Top koşmaya devam ediyor. Sınırlı sayıda çalıştırmak istersiniz. -N seçeneğini kullanın. bunun gibi:

top -b -n 1 | awk '{ ... }'

Alternatif olarak, C- \ ile yapmak istediğinizde tepeden çıkabilirsiniz. Cc kullanmak onu iptal eder ve boruyu erken keser (awk bir şey almadan önce).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

Öncelikle, Ctrl- \ demek istediğinizi kastettiğinize inanıyorum. İkincisi, bu gerçekten herhangi bir şeyi değiştirir mi? By değil boru toparacılığıyla ler' çıkışı awk, daha hızlı daha çıktı alıyorsanız. Ortada 353 kesilmiş, 512 katından oluşan bir dosya boyutunda 352½ satır elde etmeye gerçekten son veriyor musunuz?
Scott

Son "iyi" satırı ve bundan önceki tüm satırları alırsınız. Yarım satır yok (genellikle - ancak bu nawk'in çıktı ve girişi nasıl tedavi ettiğine bağlıdır). Aslında, sanırım sorunuzu yanlış anladım. Sorun muhtemelen, bu şekilde yarıda kesildiğinde çenenin hiçbir şey yazmadığıdır. Yine de burada beklediğiniz gibi çalışıyor. Hephe kabuğu, nawk ve işletim sistemi versiyonlarını eklemeniz uygun olabilir. Üzgünüm, yardım edemedim.
Ярослав Рахматуллин
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.