วิธี จำกัด จำนวนบรรทัดที่เอาต์พุตของคำสั่งมีอยู่ใน bash?


11

ฉันเริ่มดาวน์โหลดไฟล์ขนาดใหญ่ในพื้นหลังโดยใช้

$ nohup wget http://example.tld/big.iso &

ซึ่งยังทำให้ฉันไฟล์ที่มีการส่งออกของnohup.outwget

ตอนนี้ถ้าฉันต้องการดูขั้นตอนการดาวน์โหลดในภายหลังฉันสามารถใช้$ tail -f nohup.outแต่นั่นจะทำให้หน้าต่างเทอร์มินัลของฉันเร็วขึ้นกว่าที่ฉันต้องการ สิ่งที่ฉันต้องการเห็นคือบรรทัดสุดท้ายที่อัปเดตตลอดเวลา (เช่นเมื่อใช้wgetคนเดียว)

ฉันพยายาม$ tail -n 1 -f nohup.outแต่ดูเหมือนว่าจะส่งผลกระทบเฉพาะ tailin เริ่มต้น '

โดยทั่วไปแล้วหากเป็นไปได้ที่จะ จำกัด (ในกรณีนี้คือ 1) จำนวนบรรทัดของเอาต์พุตของคำสั่งที่มีอยู่ / มองเห็นได้จะช่วยแก้ปัญหานี้ได้ เรียงลำดับของการมีผลลัพธ์ในบัฟเฟอร์แบบวงกลม - แค่คิดว่าแถบความคืบหน้าปกติ$ wget example.tld/big.isoจะพิมพ์

มีวิธีแก้ปัญหาเหรอ?

หรือฉันกำลังปีนต้นไม้ผิดทาง? (หมายความว่ามันจะง่ายกว่าไหมในการ จำกัดnohupเอาต์พุตหรือทำอย่างอื่น?)

คำตอบ:


10

หากคุณไม่ต้องการ จำกัด ขอบเขตการเลื่อน (ดูคำตอบอื่น ๆ ของฉัน) คุณสามารถใช้การขึ้นบรรทัดใหม่เพื่อกลับไปที่จุดเริ่มต้นของบรรทัดก่อนพิมพ์บรรทัดถัดไป มีลำดับการหลีกเลี่ยงที่ล้างส่วนที่เหลือของบรรทัดซึ่งจำเป็นเมื่อบรรทัดปัจจุบันสั้นกว่าบรรทัดก่อนหน้า

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

6

คุณสามารถใช้watchที่นี่:

watch -n 0.5 -e "tail -n 1 nohup.out"

แก้ไข : ตัวเลือก-e(นามแฝง--exec) ดูเหมาะสมที่นี่ โดยเฉพาะอย่างยิ่งถ้าคุณมุ่งมั่นที่จะวิ่งwatchด้วยช่วงเวลาที่น้อยมากสิ่งนี้จะช่วยลดค่าใช้จ่ายที่เกิดจากการทำงานsh -cภายในโดยwatchในแต่ละรอบ


2
โปรดทราบว่าสิ่งนี้จะสร้างtailกระบวนการใหม่ทุกวินาทีซึ่งอาจเป็นหรือไม่ใช่สิ่งที่คุณสนใจ นอกจากนี้อย่าลืมระบุช่วงเวลาย่อยที่สอง (เช่นwatch -n 0.1) เพื่อจำลองส่วน "การอัพเดทตลอดเวลา" (สิ่งนี้จะเพิ่มจำนวนกระบวนการและการเปิดไฟล์อย่างเห็นได้ชัด) ในที่สุดหากคุณใช้ OS X คุณจะได้รับwatchจาก MacPort เนื่องจากไม่มีค่าเริ่มต้น
janmoesen

นี่เป็นวิธีแก้ปัญหาเล็กน้อย แต่ก็ดีเช่นนี้ ฉันคาดหวังคำตอบที่ไม่ใช่แบบเต็มหน้าจอเพื่อที่ฉันจะได้เห็นผลลัพธ์ก่อนหน้า - แต่จริงๆแล้วฉันสามารถใช้watchในหน้าต่างเทอร์มินัลใหม่ ฉันยังพบว่าการใช้tail -n 2มีประโยชน์มากกว่า-n 1ด้วยwgetอย่างน้อยกับwatchช่วงเวลา 1 วินาทีเพราะมิฉะนั้นอาจไม่เห็นเปอร์เซ็นต์ล่าสุด นี่ไม่ใช่ข้อผิดพลาดในคำตอบของคุณ แต่ฉันพูดถึงมันหากมีคนอื่นตัดสินใจที่จะดูวิดเจ็ตที่ไม่มีส่วนท้าย
Jari Keinänen

@janmoesen สำหรับสถานการณ์เฉพาะนี้การมีtailกระบวนการใหม่อาจไม่เกินความเป็นจริงมากเกินไป แต่เป็นคำตอบทั่วไปนี่เป็นการดีที่จะนำมาพิจารณา ฉันยังระบุด้วยว่าใช้งานwatch -n 0.1ไม่ได้ แต่ใช้ได้watch -n 0,1- อาจมีการใช้ตำแหน่งที่ตั้งแม้ว่าฉันไม่เคยเห็นตำแหน่งที่ตั้งที่ใช้กับตัวเลือกคำสั่งเทอร์มินัลมาก่อน ในฐานะที่เป็นบันทึกด้าน: ใช้brew install watchงานได้ดีเช่นกัน :-)
Jari Keinänen

หมายเหตุด้านข้าง: ไม่ว่าwatchจะทำงาน0,1หรือ0.1ขึ้นอยู่กับการตั้งค่าสถานที่ของคุณ (จะใช้สัญลักษณ์ทศนิยมที่กำหนดไว้สำหรับสถานที่ของคุณ) LC_ALL=C watch -n 0.1 "date +%S.%N"ตรวจสอบ
rozcietrzewiacz

3

มีลำดับการควบคุม Xtermบางอย่างที่คุณสามารถใช้เพื่อ จำกัด บรรทัดของเทอร์มินัลของคุณที่ถูกเลื่อน มองหา "ตั้งค่าขอบเขตการเลื่อน" มันเป็นบิตของกระบอง อย่าลืมรีเซ็ตเทอร์มินัลของคุณในภายหลัง:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

<ใส่บันทึกปกติเกี่ยวกับการไม่สามารถพกพาได้ที่นี่>
janmoesen

นี่เป็นทางเลือกที่ยอดเยี่ยมอีกทางหนึ่ง แต่เป็นทางเลือกที่ดีที่สุดที่ใช้ในหน้าต่างเฉพาะเนื่องจากtail -fยังคงเติมบัฟเฟอร์และเพราะเทอร์มินัลต้องการรีเซ็ตหลังจากนั้น นี่ไม่ใช่แบบอินไลน์อย่างที่ฉันหวังไว้ แต่อย่างอื่นอาจเป็นสิ่งที่ฉันต้องการ
Jari Keinänen

0

หากคุณไม่ต้องการให้เอาท์พุทที่จะครอบครองหน้าต่างเทอร์มินัลปัจจุบันทั้งหมดคุณสามารถใช้การwhileวนรอบง่าย:

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

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