Keluarkan konten file saat mereka berubah


47

Saya ingin menampilkan konten file ketika mereka berubah, misalnya jika saya memiliki file foobardan saya lakukan:

magic_command foobar

Terminal saat ini harus menampilkan isi file dan menunggu sampai, saya tidak tahu, saya tekan ^ C.

Kemudian jika dari terminal lain saya lakukan:

echo asdf >> foobar

Terminal pertama harus menampilkan baris yang baru ditambahkan di samping isi file asli (tentu saja, mengingat bahwa saya tidak menekan ^ C).

Saya akan menandai ini sebagai pekerjaan rumah karena saya ingin menjelajahi dan belajar linux, tetapi itu bukan pekerjaan rumah, itu hanya rasa ingin tahu saya.


Jawaban:


79

Anda dapat menggunakan tail commanddengan -f :

tail -f /var/log/syslog 

Ini solusi yang bagus untuk pertunjukan waktu nyata.


Anda dapat menulis skrip dan mengarahkan output Anda ke skrip Anda.
— PersianGulf

6
Anda juga dapat menggunakan -F(huruf besar f), yang akan membuka kembali file jika dihapus dan dibuat ulang di sepanjang jalan.
— peterph

19

Jika Anda ingin menampilkan file pendek, yang pas di satu layar terminal, dan apa yang berubah mungkin seluruh file, Anda bisa menggunakan watch:

watch cat example.txt

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

Some text
another line

Ini menunjukkan seluruh file setiap 2 detik secara default, termasuk header opsional:

Opsi -d( --differences) akan menyoroti perubahan dari versi keluaran sebelumnya, atau dari versi pertama.


9

Ketika saya perlu mendeteksi perubahan file dan melakukan sesuatu selain yang tail -f filenamedilakukan, saya telah menggunakan inotifywaitskrip untuk mendeteksi perubahan dan menindaklanjutinya. Contoh penggunaan ditunjukkan di bawah ini. Lihat man inotifywaitnama dan sakelar acara lainnya. Anda mungkin perlu menginstal inotify-toolspaket, misalnya melalui sudo apt-get install inotify-tools.

Berikut contoh skrip yang disebut 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

Dalam dua konsol saya memasukkan perintah sebagai berikut (di mana A> berarti entri di konsol A, dan B> berarti entri di konsol 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

Output berikut dari cat tmuncul di konsol 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

Output berikut dari exec-on-changemuncul di konsol 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

The exec-on-changeScript dihentikan ketika saya rm'd t.


8

lessmemiliki mode ikuti yang mirip dengan tail -f- tekan saja Fketika Anda membukanya.


4

Saya punya tiga solusi:

1) tail -f adalah ide yang bagus

2) kita juga tailfharus menggunakan

3) yang ketiga adalah skrip bash:

#!/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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.