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).
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.
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.
less
má režim sledování podobný tail -f
- stačí otevřít F
, když ji máte otevřenou.
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
.
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