เนื้อหาไฟล์ที่ส่งออกในขณะที่พวกเขาเปลี่ยน


47

ฉันต้องการส่งออกเนื้อหาของไฟล์ในขณะที่มีการเปลี่ยนแปลงตัวอย่างเช่นถ้าฉันมีไฟล์foobarและฉันต้องการ:

magic_command foobar

เทอร์มินัลปัจจุบันควรแสดงเนื้อหาของไฟล์และรอจนกระทั่งฉันไม่รู้ฉันกด ^ C

ถ้าเป็นเช่นนั้นจากเทอร์มินัลอื่นฉัน:

echo asdf >> foobar

เทอร์มินัลแรกควรแสดงบรรทัดที่เพิ่มใหม่นอกเหนือจากเนื้อหาไฟล์ต้นฉบับ (แน่นอนเนื่องจากฉันไม่ได้กด ^ C)

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


คำตอบ:


79

คุณสามารถใช้tail commandกับ-f :

tail -f /var/log/syslog 

มันเป็นทางออกที่ดีสำหรับการแสดงตามเวลาจริง


คุณสามารถเขียนสคริปต์และเปลี่ยนเส้นทางผลลัพธ์ไปยังสคริปต์ของคุณ
PersianGulf

6
นอกจากนี้คุณยังสามารถใช้-F(ตัวพิมพ์ใหญ่ f) ซึ่งจะเปิดไฟล์อีกครั้งหากไฟล์นั้นถูกลบและสร้างขึ้นใหม่ตลอดทาง
เตอร์

19

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

watch cat example.txt

Every 2.0s: cat example.txt                                Sun Aug  3 15:25:20 2014

Some text
another line

มันจะแสดงไฟล์ทั้งหมดทุก 2 วินาทีโดยค่าเริ่มต้นรวมถึงส่วนหัวเสริม:

ตัวเลือก-d( --differences) จะเน้นการเปลี่ยนแปลงจากรุ่นก่อนหน้าของผลลัพธ์หรือจากรุ่นแรก


9

เมื่อฉันต้องการตรวจจับการเปลี่ยนแปลงไฟล์และทำสิ่งอื่นที่ไม่ใช่สิ่งที่tail -f filenameฉันได้ใช้inotifywaitในสคริปต์เพื่อตรวจจับการเปลี่ยนแปลงและดำเนินการกับมัน ตัวอย่างการใช้งานแสดงไว้ด้านล่าง ดูman inotifywaitชื่อเหตุการณ์และสวิตช์อื่น ๆ คุณอาจจะต้องติดตั้งแพคเกจเช่นผ่านinotify-toolssudo apt-get install inotify-tools

นี่คือตัวอย่างสคริปต์ที่เรียกว่าexec-on-change:

 #!/bin/sh

# Detect when file named by param $1 changes.
# When it changes, do command specified by other params.

F=$1
shift
P="$*"

# Result of inotifywait is put in S so it doesn't echo
while  S=$(inotifywait -eMODIFY $F 2>/dev/null)
do
  # Remove printf if timestamps not wanted 
  printf "At %s: \n" "$(date)"
  $P
done

ในคอนโซลที่สองฉันป้อนคำสั่งดังนี้ (โดย A> หมายถึงรายการในคอนโซล A และ B> หมายถึงรายการในคอนโซล B. )

A> rm t; touch t
B> ./exec-on-change t wc t
A> date >>t
A> date -R >>t
A> date -Ru >>t
A> cat t; rm t

เอาต์พุตต่อไปนี้cat tปรากฏขึ้นในคอนโซล A:

Thu Aug 16 11:57:01 MDT 2012
Thu, 16 Aug 2012 11:57:04 -0600
Thu, 16 Aug 2012 17:57:07 +0000

เอาต์พุตต่อไปนี้exec-on-changeปรากฏขึ้นในคอนโซล B:

At Thu Aug 16 11:57:01 MDT 2012: 
 1  6 29 t
At Thu Aug 16 11:57:04 MDT 2012: 
 2 12 61 t
At Thu Aug 16 11:57:07 MDT 2012: 
 3 18 93 t

exec-on-changeสคริปต์สิ้นสุดลงเมื่อฉัน'drmt



4

ฉันมีสามวิธี:

1) tail -fเป็นความคิดที่ดี

2)เรายังtailfต้องใช้

3) อันที่สามคือสคริปต์ทุบตี:

#!/bin/bash

GAP=10     #How long to wait
LOGFILE=$1 #File to log to

if [ "$#" -ne "1" ]; then
    echo "USAGE: `basename $0` <file with absolute path>"
    exit 1
fi


#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."

while :
do
    if [ -N $LOGFILE ]; then
        echo "`date`: New Entries in $LOGFILE: "
        newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
        newlines=`expr $newlen - $len`
        tail -$newlines $LOGFILE
        len=$newlen
    fi
sleep $GAP
done
exit 0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.