it-swarm-eu.dev

Výstup obsahu souboru, zatímco se mění

Chci vytisknout obsah souboru, zatímco se mění, například pokud mám soubor foobar a mám:

magic_command foobar

Aktuální terminál by měl zobrazit obsah souboru a počkat, dokud nevím, stisknu ^ C.

Pak pokud z jiného terminálu udělám:

echo asdf >> foobar

První terminál by měl kromě původního obsahu souboru zobrazit nově přidaný řádek (samozřejmě vzhledem k tomu, že jsem nestiskl ^ C).

50
Paul

Můžeš použít tail command s -f:

tail -f /var/log/syslog 

Je to dobré řešení pro show v reálném čase.

83
PersianGulf

Pokud chcete zobrazit krátký soubor, který se hodí na jednu obrazovku terminálu a co se mění, je pravděpodobně celý soubor, můžete použít watch:

watch cat example.txt

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

Some text
another line

Ve výchozím nastavení zobrazuje celý soubor každé 2 sekundy včetně volitelné hlavičky:

Možnost -d (--differences) zvýrazní změny z předchozí verze výstupu nebo z první verze.

19
Volker Siegel

less má režim sledování podobný tail -f - stačí otevřít F, když ji máte otevřenou.

10
peterph

Když potřebuji detekovat změny souborů a udělat něco jiného, ​​než co tail -f filename ano, použil jsem ve skriptu inotifywait ke zjištění změny a na ni reagoval. Příklad použití je uveden níže. Viz man inotifywait pro další názvy událostí a přepínače. Možná budete muset nainstalovat inotify-tools balíček, například prostřednictvím Sudo apt-get install inotify-tools.

Zde je ukázkový skript s názvem 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

Ve dvou konzolách jsem zadal příkazy následovně (kde A> znamená záznam v konzole A a B> znamená zápis v konzole 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

Následující výstup z cat t se objevil v konzole 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

Následující výstup z exec-on-change se objevil v konzole 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-change skript byl ukončen, když jsem rm 'd t.

9

Mám tři řešení:

1)tail -f je dobrý nápad

2) máme také tailf k použití

) třetí je bash skript:

#!/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
4
MLSC