Değişirken dosya içeriğini çıkar


47

Değişken bir dosyanın içeriğini, örneğin, dosyam varsa foobarve şunu yaparsam, çıktı almak istiyorum:

magic_command foobar

Geçerli terminal dosyanın içeriğini göstermeli ve bilmiyorum, ^ C tuşlarına basana kadar beklemeliyim .

O zaman başka bir terminalden yaparsam:

echo asdf >> foobar

İlk terminal, orijinal dosya içeriğine ek olarak yeni eklenen satırı görüntülemelidir (tabii ki, ^ C tuşlarına basmadığımdan).

Linux'u keşfetmek ve öğrenmek istediğim için bunu ödev olarak işaretleyeceğim, ama bu ödev değil, sadece bir merakım.


Yanıtlar:


79

Sen kullanabilirsiniz tail commandile -f :

tail -f /var/log/syslog 

Gerçek zamanlı şov için iyi bir çözüm.


bir komut dosyası yazıp çıktınızı komut dosyanızı yeniden yönlendirebilirsiniz.
PersianGulf

6
Ayrıca -F, dosya kaldırılır ve yeniden oluşturulursa dosyayı yeniden açacak olan (f harfi) de kullanabilirsiniz .
peterph

19

Tek bir terminal ekranına uyan kısa bir dosya göstermek istiyorsanız ve değişen şey muhtemelen tüm dosya ise, şunları kullanabilirsiniz watch:

watch cat example.txt

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

Some text
another line

İsteğe bağlı bir başlık da dahil olmak üzere tüm dosyayı varsayılan olarak her 2 saniyede bir gösterir:

Seçeneği -d( --differences) çıktının önceki sürümünden veya ilk sürümden gelen değişiklikleri vurgulayacaktır.


9

Dosya değişikliklerini tespit etmem ve yaptığımdan başka bir şey yapmam gerektiğinde, değişikliği tespit etmek ve üzerinde çalışmak için bir komut dosyasında tail -f filenamekullandım inotifywait. Kullanım örneği aşağıda gösterilmiştir. man inotifywaitDiğer olay isimleri ve anahtarları için bakınız . inotify-toolsÖrneğin, üzerinden paketi yüklemeniz gerekebilir sudo apt-get install inotify-tools.

İşte denilen örnek komut dosyası 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

İki konsolda komutları şu şekilde girdim (burada A> A konsolunda giriş anlamına gelir ve B> B konsolunda giriş anlamına gelir)

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

Aşağıdaki çıktı cat tkonsol A'da göründü:

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

Aşağıdaki exec-on-changeçıktı, konsol B'de göründü:

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-changeKomut zaman sona rm'd t.


8

lessbenzer bir takip modu var tail -f- sadece Façık olduğunda vur .


4

Üç çözümüm var:

1) tail -f iyi bir fikir

2)tailf kullanmak zorundayız

3) üçüncüsü bir bash betiğidir:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.