it-swarm-tr.com

Bir dosyadaki değişiklikleri izlemek için Shell komutu

Unix'te bir dosyayı izlemek ve ona yazılan değişiklikleri görmek için kullanabileceğim bir komut olduğunu biliyorum. Bu özellikle günlük dosyalarını kontrol etmek için oldukça kullanışlıdır.

Ne dendiğini biliyor musunuz?

167
Sebastian Hoitz

Demek istedin

tail -f logfile.log

?

( Kuyruk için adam sayfası )

220
Jon Skeet

Jon Skeet'in cevabına göre muhtemelen kuyruk demek istedin.

Başka bir yararlı olanı watch ; bir komutu periyodik olarak çalıştırmanıza ve çıktıyı tam ekran görmenize olanak tanır. Örneğin:

 -n 10 -d ls -l /var/adm/messages

Her 10 saniyede bir ls -l /var/adm/messages Komutunu çalıştırır ve sonraki çalıştırmalar arasındaki çıktıdaki farkı vurgular. (Örneğin, bir günlük dosyasının ne kadar hızlı büyüdüğünü izlemek için kullanışlıdır).

128
Murali Suriar

inotifywait from inotify-tools , bir dosya (veya dizindeki herhangi bir dosya) her değiştiğinde bir komut çalıştırmak istiyorsanız kullanışlıdır. Örneğin:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
42
richvdh

less +FG1 bitmiş tail -f çünkü kendimi bir günlük dosyasında belirli bir hata veya kimlik aramak zorunda buldum. Bir şey aramam gerekirse, ^C dosyasını izlemeyi durdurmak ve ? geriye doğru aramaya başlamak için.

Anahtar bağlamaları vi ile hemen hemen aynıdır. Herhangi bir komut başlangıçta + seçenek:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Gerçekten uzun günlükler için, -n satır numarasını kapatan seçenek. Manpage'den:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose Prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Açıklamalarda bunu işaret ettiği için rgmarcha adresine bir ipucu.

37
Jon Ericson

Kuyruk harika ... daha az da kullanılabilir daha az dosyada başlatmak, yani daha az dosyam sonra basın Shift+F. Bunun kuyruk olarak daha az etkisi vardır.

21
trent

Bir LaTeX dosyasını düzenliyorum ve ortada bir yerde değişiklikler için de izlemek istedim. Benim için yararlı olduğunu kanıtlayan aşağıdaki küçük Shell betiğini kırbaçladım. Umarım başka birine de faydalı olur.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

watch.sh ve chmod u+x watch.sh. Sonra aşağıdaki gibi yürütmek:

./watch.sh file.tex pdflatex

Komutun yalnızca gerçek değişiklik gerçekleştiğinde çalışmasını istiyorsanız `md5sum "$FILE"` onun yerine `ls -l "$FILE"`.

16
oliphaunt

tailf komutunu en kolay komutunu kullanabilirsiniz

tailf logfile.log
8
reegan vijay

Çekirdek inotify alt sistemine bağlanan inotifywatch/inotifywait'i de kullanabilirsiniz. Bu şekilde "aç", "kapat" veya "erişim" gibi şeyleri de izleyebilirsiniz.

Ancak stdout'a eklenen satırları almak istiyorsanız, kuyrukta katılıyorum.

6
Martin

Kuyruk standart, geleneksel, her yerde kullanılabilir unix aracıdır. Biraz daha sofistike bir araç multitail ve aynı anda birkaç dosyayı izleyebilir ve sözdizimi vurgulama yapar.

3
hlovdal

Eğer sadece dosyalamaya ek olarak dosya etrafında arama yapmak istiyorsanız, "F" komutuyla daha az kullanıyorum.

Kuyruğu kullanırken, dosya dönüyorsa veya değiştirilebiliyorsa ek argümanlar gerektiğini unutmayın (vim'ler için varsayılan mod: w).

tail -f, tail'in dosya tanımlayıcısını saklamasına ve izlemesine neden olur. Dosya değiştirilirse tanımlayıcı değiştirilir. Dosya tanımlayıcıyı izlemenin yararı, dosya yeniden adlandırılırsa, dosyayı izlemeye devam etmenizdir.

tail --follow = değiştirilip değiştirilmediğini görmek için düzenli aralıklarla dosyayı yeniden adlandırır.

--retry, bir günlük dosyasını kuyruğa almak istiyorsanız ancak dosya henüz oluşturulmamışsa başka bir yararlı seçenektir.

tail -F --follow = --retry için bir kısayoldur.

3
deinspanjer

Tailf'i unut, diff istediğin komut. Farklılıkları 2 dosya arasındaki gerçek zamanlı (veya yakın) veya yazılan bir dosyadaki gibi izlemek için iyi bir hile.

Davranışı istediğiniz gibi değiştirmek için değişiklikleri kaydetmek için bir dosyaya yazmak gibi bu yöntemleri kullanabilirsiniz. Aşağıdaki komutlar için saat aralığı veya diğer seçeneklerle oynayın.

1 dosyanız var ve dosyada değişiklik yapıldığından izlemek istiyorsunuz:

Yani heres ne yapmalı:

  1. dosyayı kopyala

    cp file file2
    
  2. farklılıkları bulmak için bir bash betiği yazın ve file2'yi güncelleyin

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. İşte senaryo için temel bir fikir. İsterseniz bir dosyaya yazmasını sağlayın

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. Ardından, saati kullanarak ekrandaki farkları izleyebilirsiniz.

    watch ./check-differences
    

bu varsayılan olarak her 2 saniyede bir güncellenir. Bu nedenle, geri dönüp onları okumanız gerekiyorsa, diff'in çıktısını koddaki bir dosyaya yazın.

Veya çıktıyı görmeniz gerekmiyorsa betiğinizi düzenli olarak çalıştırmak için cron kullanın.

2
Mezmer

Süre tail -f somefile.txt yeni verilerle kaydırmaya devam ediyor, ben bazen tercih less +G somefile.txt de dosyadaki en son verilerin bir yamasına bakmak için.

1
phantomastray