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.

Paul
sumber
stackoverflow.com/questions/6143838/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

79

Anda dapat menggunakan tail commanddengan -f :

tail -f /var/log/syslog 

Ini solusi yang bagus untuk pertunjukan waktu nyata.

Teluk Persia
sumber
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.

Volker Siegel
sumber
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.

James Waldby - jwpat7
sumber
8

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

peterph
sumber
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
MLSC
sumber