เอาต์พุตของคำสั่ง 'watch' เป็นรายการ


27

ฉันต้องการทำการคำนวณอย่างง่าย ๆ ของจำนวนบรรทัดต่อนาทีที่เพิ่มลงในไฟล์บันทึก

ฉันต้องการเก็บการนับในแต่ละวินาทีด้วย

สิ่งที่ฉันต้องการคือผลลัพธ์ของคำสั่งต่อไปนี้เป็นรายการซึ่งจะถูกอัพเดตทุกวินาที:

watch -n1 'wc -l my.log'

วิธีการส่งออก 'update' ของคำสั่ง 'watch' เป็นรายการ?

คำตอบ:


24

คุณสามารถใช้-tสวิตช์watchที่ทำให้มันไม่พิมพ์ส่วนหัว อย่างไรก็ตามนั่นจะยังคงล้างหน้าจอดังนั้นคุณอาจจะดีขึ้นด้วยการวนรอบเชลล์ที่เรียบง่าย:

while sleep 1; do
    wc -l my.log
done

ข้อดีอย่างหนึ่งคือคุณสามารถเพิ่มคำสั่งอื่น ๆ (เช่นdate) และ / หรือไพพ์เอาต์พุตอย่างง่ายดายsedเพื่อทำการฟอร์แมตใหม่ โดยวิธีการถ้าคุณสลับsleep 1กับwcในวงมันจะยุติโดยอัตโนมัติเมื่อเกิดข้อผิดพลาด


อย่างไรก็ตามโปรดทราบว่ามันจะไม่ทำทุกวินาที (ด้วย zsh หรือ ksh93 คุณสามารถปรับเวลานอนเพื่อพิจารณาการดริฟท์ที่เกิดขึ้นจากการรันคำสั่งในลูป)
Stéphane Chazelas

2
@StephaneChazelas ไม่ใช้wait- ลองwatch -n 1 "sleep 5"เลย
เตอร์

แน่นอน (ฉันได้ตรวจสอบการใช้งานทั้ง procps และ busybox) ฉันคิดว่านั่นเป็นสิ่งเดียวที่watchมีประโยชน์ แต่ก็ไม่ได้ให้คุณดังนั้นวิธีการแก้ปัญหาของคุณจึงดีเท่ากับนาฬิกาที่ใช้ แต่ไม่ตอบคำถาม"อัตราการเติบโตของไฟล์บันทึก" ที่มีความแม่นยำสูง
Stéphane Chazelas

ถ้าเส้นต่อนาทีเป็นเป้าหมายสูงสุดให้สุ่มตัวอย่างทุกๆ 10 วินาทีนั้นมากเกินพอ imho ดังนั้นค่าโสหุ้ยนั้นไม่น่ากลัวเลย (เว้นแต่ไฟล์จะโตขึ้นมากจริงๆ) และจากภายในลูปคุณสามารถพิมพ์ข้อมูลกำหนดเวลาได้ (ทั้งก่อนและหลังคำสั่งเสร็จสิ้นหากจำเป็น) จากนั้นความแม่นยำก็จะดีขึ้น (คำสั่งของขนาด) แม้สำหรับไฟล์ที่ใหญ่กว่า
เตอร์

1
@peterph watchมี-pตัวเลือกที่จะทำสิ่งนั้นถูกต้องหากเป็นไปได้ (เห็นได้ชัดว่าคุณไม่สามารถทำคำสั่งที่ใช้เวลา 5 วินาทีทุก 1 วินาทีหากคุณไม่ได้รับอนุญาตหลายอย่างพร้อมกัน) ฉันรู้ว่าฉันเขียนมัน :-P
derobert

8

เป็นคำถามเก่า แต่ฉันเพิ่งพบคำตอบที่ง่ายมาก:

watch -n1 'wc -l my.log | tee -a statistics.log'

สิ่งนี้จะดำเนินการwcในแต่ละวินาทีของคุณเพิ่มเอาท์พุทไปยังไฟล์ stats.log และแสดงบนหน้าจอ ดังนั้นคุณจะจบลงด้วยไฟล์เต็มไปด้วยตัวเลขแทนจำนวนต่อเนื่องของสายของ
my.log


โปรดทราบว่าคำสั่งนี้จะไม่watch "($MYCMD | tee -a $MYLOG)" watch "($MYCMD)" | tee -a $MYLOGถ้าคุณทำผิดแบบนี้ฉันจะเอาท์พุทจะสับสนมาก สิ่งที่ควรทราบอีกประการหนึ่งคือคำสั่งนี้ไม่ได้เพิ่มการประทับเวลาของการดำเนินการของแต่ละคำสั่งโดยค่าเริ่มต้นดังนั้นคำตอบของลูปอาจยังทำงานได้ดีขึ้นสำหรับคุณ
ffledgling



1

ฉันมาข้ามคำถามนี้เมื่อฉันได้พยายามที่จะได้รับดีขึ้น / du -sh $data_pathลงทะเบียนเอาท์พุทจาก ฉันใช้รูปแบบ "ขณะที่สั่งทำสลีป" พบที่นี่ แต่ใช้ AWK ที่ซับซ้อนบางอย่างเพื่อให้ผลลัพธ์ที่ฉันต้องการ

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

จริง ๆ แล้วฉันทำสิ่งนี้ในฐานะผู้เผยแพร่ทางอินเทอร์เน็ตซึ่งเป็นสาเหตุที่มีเครื่องหมายอัฒภาค แต่เพื่อให้อ่านง่ายฉันก็โพล่งออกมา ผลลัพธ์ดูเหมือนว่า:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

คุณสามารถสร้างสคริปต์ที่ทำเพื่อคุณ ฉันโทรหาฉันkeep(เช่นทำต่อไป) และวางมันบนbinเส้นทาง

นี่คือสคริปต์ของฉัน:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
คุณควรใช้"$@"ในการดำเนินการคำสั่ง (อาร์กิวเมนต์) แทนการ $*unquoted วิธีนี้คุณจะมีเชลล์เก็บอาร์กิวเมนต์ที่อ้างถึง ฯลฯ ตามที่ผู้ใช้คาดหวัง FTFY
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.