วิธีการใช้คำสั่ง watch กับสายโซ่ของคำสั่ง / โปรแกรม


50

ฉันมักจะใช้watchยูทิลิตี้ linux เพื่อดูผลลัพธ์ของคำสั่งซ้ำ ๆ ทุก ๆ n วินาทีเช่นในwatch df -h /some_volume/

แต่ฉันดูเหมือนจะไม่สามารถใช้watchกับชุดคำสั่ง piped เช่น:

$ watch ls -ltr|tail -n 1

ถ้าฉันทำอย่างนั้นwatchจริง ๆ กำลังดูls -ltrและกำลังส่งผ่านไปtail -n 1ซึ่งไม่แสดงผลอะไร

ถ้าฉันลองทำสิ่งนี้:

$ watch (ls -ltr|tail -n 1)

ฉันเข้าใจ

$ watch: syntax error near unexpected token `ls'

และข้อใดข้อหนึ่งต่อไปนี้ล้มเหลวด้วยเหตุผลบางประการ:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

และในที่สุดถ้าทำสิ่งนี้:

$ watch echo $(ls -ltr|tail -n 1)

ฉันไม่เห็นการเปลี่ยนแปลงในเอาต์พุตในช่วงเวลาที่กำหนดเนื่องจากคำสั่งภายใน$()รันเพียงครั้งเดียวและสตริงผลลัพธ์ที่ได้จะถูกพิมพ์ออกมาเสมอ ("เฝ้าดู") ตามตัวอักษร

ดังนั้นฉันจะทำให้watchคำสั่งทำงานร่วมกับสายโซ่ของคำสั่ง [อื่น ๆ ที่วางไว้ในสคริปต์] ได้อย่างไร


เรียกใช้man watchและเลื่อนลงไปที่ตัวอย่าง ...
don_crissti

คำตอบ:


80
watch 'command | othertool | yet-another-tool'

1
อาจจะคุ้มค่าที่จะสังเกตเห็นวิธีการทั่วไปเช่นกันwatch sh -c 'command | etc'โดยเฉพาะอย่างยิ่งการพิจารณาวิธีการที่ลองทำในคำถาม
sourcejedi

@sourcejedi ฉันไม่ได้หาสาเหตุจริงๆ แต่สิ่งนี้จะไม่ให้ผลลัพธ์ที่เหมือนกันเสมอไป
Michael Mior

10
watch -n 1 "ls -lrt | tail -n20; date"

ให้คุณท่อและทำงานในแถว


สิ่งที่เป็น-n 1อยู่หรือ?
Nam G VU

2
@NamGVU: เรียกใช้คำสั่งทุก 1 วินาที
Duc Tran

1

หากคุณต้องการแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีย่อยด้วยคุณสามารถใช้คำสั่ง find พร้อมกับตัวเลือก exec

watchจะอัปเดตทุก ๆ 30 วินาทีและfindจะค้นหาไฟล์ * .log ทั้งหมดใน dir ปัจจุบัน (รวมถึงส่วนย่อย) และจะพิมพ์ชื่อไฟล์และ 10 บรรทัดสุดท้าย:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.