変更中にファイルの内容を出力する


47

ファイルの内容を変更しながら出力したい。たとえば、ファイルがfoobarあり、次のようにした場合:

magic_command foobar

現在の端末には、ファイルの内容を表示しなければならない待つ私は^ Cを押すと、私は知らない、まで。

その後、別の端末から私がする場合:

echo asdf >> foobar

最初の端末には、元のファイルの内容に加えて、新しく追加された行が表示されるはずです(もちろん、^ Cを押さなかった場合)。

Linuxを調べて学びたいので、これを宿題とするつもりですが、それは宿題ではなく、単なる私の好奇心です。


回答:


79

あなたは使用することができますtail command-f

tail -f /var/log/syslog 

リアルタイムショーに適したソリューションです。


スクリプトを記述して、出力をスクリプトにリダイレクトできます。
ペルシャ湾

6
また、-F(大文字のf)を使用することもできます。これは、ファイルが削除されて途中で再作成された場合にファイルを再度開きます。
ペテルフ

19

1つの端末画面に収まる短いファイルを表示したい場合、ファイル全体が変更される可能性がある場合は、次を使用できますwatch

watch cat example.txt

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

Some text
another line

デフォルトでは、オプションのヘッダーを含む2秒ごとにファイル全体が表示されます。

オプション-d--differences)は、出力の以前のバージョンまたは最初のバージョンからの変更を強調表示します。


9

ファイルの変更を検出tail -f filenameし、それ以外のことを行う必要がある場合inotifywait、スクリプトで使用して変更を検出し、それに対処しました。使用例を次に示します。man inotifywait他のイベント名とスイッチを参照してください。inotify-toolsたとえば、を介してパッケージをインストールする必要がある場合がありますsudo apt-get install inotify-tools

以下に、スクリプトの例を示します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

2つのコンソールで、次のようにコマンドを入力しました(A>はコンソールAのエントリを意味し、B>はコンソール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

次の出力cat tはコンソール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

次の出力exec-on-changeはコンソール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

exec-on-changeこのスクリプトは、ときに私に終了rm「D t


8

less次のようなフォローモードがありますtail -f- F開いているときにヒットします。


4

私には3つの解決策があります:

1) tail -f良いアイデアです

2)私たちもtailf使わなければなりません

3) 3番目は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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.