ทำไม grep ไม่ทำงานกับการเปลี่ยนเส้นทาง?


15

การใช้topคำสั่งด้วยการเปลี่ยนเส้นทางทำงานได้ดี:

top > top.log

ตอนนี้ฉันต้องการใช้ grep เพื่อกรองบรรทัด:

top | grep "my_program" > top.log

แต่ไฟล์บันทึกจะว่างเปล่า แต่ grep ให้เอาต์พุตเมื่อใช้

top | grep "my_program"

ไหนmy_programจะต้องมีการแทนที่ด้วยโปรแกรมวิ่งไปดูการส่งออกบางส่วน

ทำไมวิธีการของฉันไม่ทำงาน และฉันจะแก้ไขได้อย่างไร

bash  grep 

2
ฉันแค่ลองมันแล้วมันก็ใช้ได้ผลสำหรับฉัน อย่างไรก็ตามคุณควรดูที่-bตัวเลือกเพื่อtopหรือใช้psแทน
Lev Levitsky

-bไม่ได้แก้ปัญหาของฉัน แต่แก้ไขปัญหาการเข้ารหัสบางอย่าง ขอขอบคุณ.

คำตอบ:


22

ฉันได้รับพฤติกรรมเดียวกับที่คุณอธิบาย บน Ubuntu 11.10

top | grep "my_program" > top.log

ไม่สร้างผลลัพธ์ใด ๆ

ฉันเชื่อว่าเหตุผลนี้คือ grep กำลังบัฟเฟอร์เอาต์พุต ในการบอก GNU grep ให้คายเอาท์พุททีละบรรทัดใช้--line-bufferedตัวเลือก:

top | grep --line-buffered "my_program" > top.log

ดูคำถาม SOเช่นนี้สำหรับวิธีแก้ปัญหาอื่น ๆ


3
+1 --line-bufferedแก้ปัญหา

ขอบคุณสิ่งนี้แก้ปัญหาให้ฉันได้เช่นกัน -bตัวเลือกก็ยังคงเป็นคำแนะนำที่ดีจากเลฟ Levitsky เกินไป ที่แก้ไขปัญหาการเข้ารหัสบางอย่างกับไฟล์บันทึก

2

คุณควรใช้:

top -n 1 | grep "blah" > top.log

"-n 1" รันบนสุดสำหรับการวนซ้ำหนึ่งครั้งแล้วออกจากการทำงานแทนการอัปเดตอย่างต่อเนื่องทุกสองสามวินาที

เนื่องจากคุณแค่มองหาหนึ่งบรรทัดแม้ว่า ps จะเป็นเครื่องมือที่ดีกว่าในการใช้งาน


1

วิธีแก้ปัญหาสำหรับปัญหานี้คือ:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

ด้วยวิธีนี้ฉันสามารถใช้ monitor เป็นพื้นหลังสำหรับ my_program และเก็บผลลัพธ์ทั้งหมดไว้ในไฟล์ top.log



0

แม้ว่าทั้งคู่จะทำงานให้ฉัน แต่ฉันคิดว่าคำแนะนำของ Lev Levitsky นั้นถูกต้อง ใช้-bอาร์กิวเมนต์

มีโอกาสที่ดีที่การเปลี่ยนเส้นทางผลลัพธ์เป็นปัญหาและคุณไม่ได้รับอะไรผ่าน stdout ดังนั้นให้ลองทำสิ่งนี้แทน:

top -b 2>&1 | grep "my_program" > top.log

โปรดทราบว่าคุณอาจมีปัญหากับการบัฟเฟอร์เอาต์พุตเช่นกัน เชลล์ของคุณจะไม่เขียนลงไฟล์อย่างต่อเนื่องดังนั้นจึงอาจใช้เวลาสักครู่ในtop.logการเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.