Invia i contenuti del file mentre cambiano


47

Voglio produrre i contenuti di un file mentre cambiano, ad esempio se ho il file foobare lo faccio:

magic_command foobar

Il terminale corrente dovrebbe visualizzare il contenuto del file e attendere fino a quando, non lo so, premo ^ C.

Quindi se da un altro terminale faccio:

echo asdf >> foobar

Il primo terminale dovrebbe visualizzare la riga appena aggiunta oltre al contenuto del file originale (ovviamente, dato che non ho premuto ^ C).

Lo segnerò come compiti poiché voglio esplorare e imparare Linux, ma non sono compiti, è solo una mia curiosità.


Risposte:


79

Puoi usare tail commandcon -f :

tail -f /var/log/syslog 

È una buona soluzione per lo spettacolo in tempo reale.


puoi scrivere uno script e reindirizzare il tuo output sul tuo script.
Golfo Persico

6
Puoi anche usare -F(maiuscolo f), che riaprirà il file se viene rimosso e ricreato lungo il percorso.
peterph,

19

Se vuoi mostrare un breve file, che si adatta su una schermata del terminale, e ciò che sta cambiando è forse l'intero file, puoi usare watch:

watch cat example.txt

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

Some text
another line

Mostra l'intero file ogni 2 secondi per impostazione predefinita, inclusa un'intestazione opzionale:

L'opzione -d( --differences) evidenzierà le modifiche rispetto alla versione precedente dell'output o dalla prima versione.


9

Quando devo rilevare le modifiche ai file e fare qualcosa di diverso da quello tail -f filenameche faccio, ho usato inotifywaituno script per rilevare le modifiche e agire di conseguenza. Di seguito è mostrato un esempio di utilizzo. Vedere man inotifywaitper altri nomi di eventi e switch. Potrebbe essere necessario installare il inotify-toolspacchetto, ad esempio tramite sudo apt-get install inotify-tools.

Ecco lo script di esempio, chiamato 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

In due console ho inserito i comandi come segue (dove A> indica la voce nella console A e B> significa la voce nella console 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

Il seguente output di è cat tapparso nella console 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

Il seguente output di è exec-on-changeapparso nella console 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

La exec-on-changesceneggiatura terminato quando ho rm'd t.


8

lessha una modalità follow simile a tail -f- basta premere Fquando l'hai aperto.


4

Ho tre soluzioni:

1) tail -f è una buona idea

2) dobbiamo anche tailfusare

3) il terzo è uno script 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.