ファイルを「検索して追跡」するには?

ファイルを「検索して追跡」するには?

ファイルを順次ダウンロードしていますwget

アンパックを使用し始めるとcat myfile.tar.bz2 | tar -xj、どちらが速いかによって正しく解凍されたり、「予期しないEOF」によって失敗することがあります。

ファイルを "cat and follow"する方法、つまりファイルの内容をstdoutに出力しますが、EOFで終了せずにファイルサブスクリプションを維持し、データの新しい部分を出力し続け、ファイルが閉じられたときにのみビルダーを終了する方法N秒後に再び開くなかった。


スクリプトを作成しました。猫とフォロー@arielCoベース回答tailまた、ファイルが書き込み用に開かれていない場合は終了します。

答え1

tail +1f file

wgetLibreOfficeソースtarballをダウンロードしたときにUbuntuでテストしました。

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

また、Android携帯のSolaris 10、RHEL3、AIX 5、およびBusybox 1.22.1(tail +1 -f fileBusyboxで使用)でも機能します。

答え2

問題は、catファイルがまだ添付されていることを知らないことです。ファイルの(現在の)終わりが見つかるとcat終了します。

wgetこれを防ぐには、パイプ(またはFIFO)に書き込む必要があります。

wget -O - http://... | tar -xjf -

答え3

到着読んでフォローする開始から停止までのファイル:

tail -fn +1 file

これを実証するには、次のことを試してみてください(Bash用GNU Coreutilsを想定)。

(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file  # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill %  # Kills the while-loop.

(注:+1f他の人が言及したものは、少なくともGNUtailコマンドではファイル名として解釈されます。)

上記は単一ファイルに適用されます。複数のファイルをリンクすると、最初のファイルにぶら下がらず、すべてのファイルに決定的に従うことはありません。到着する」猫とフォロー'、最後のファイル以降にのみ使用できます。プロセスの交換。もう一つのデモは次のとおりです。

printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2)  # (Interrupt or kill it.)
kill %  # Kills the while-loop.

答え4

そしてless +F[私が一番好き]

less示されているように、GNUバージョン487を使用してLinux Ubuntu 18.04でテストされましたless --version

以下も使用できますless

less -N +F path/to/some/growing/log_file.log

フォローしたいかもしれません名前次のオプションを追加してファイル記述子を置き換えます--follow-name

# [My favorite command overall]
less -N --follow-name +F path/to/some/growing/log_file.log

log_file.loglog_file.log.1たとえば、ログ記録を開始するために新しいログファイルにローテーションしたときに、ローテーションログシステムがファイル名を変更した場合でも、というファイルを追跡するのに役立ちます。 WITHOUT--follow_nameは凍結され、もはや大きくなっていないlessファイルを追跡し続けるのに対して、WITH、は名前の変更を確認し、自動的に新しいファイルを開き、追跡を開始します。log_file.log.1--follow-namelesslog_file.logねえ

行番号を表示します-N。シンボルを開いた直後に+コマンドが実行されるようにしますless+このFコマンドを使用すると、ファイルの終わりを継続的に読み込んで読み込むことができます(例: "follow")、これはログファイルの増加を確認するのに特に役立ちます。オンの間F(たとえば、Shift+)を押すFのは+を押すのと同じです。lessCtrlEnd

less実行中にこの連続ロード効果を中断して停止するには、Ctrl+を押しますC。これで正常に使用でき、less必要に応じて上下にスクロールしてデータを表示できます。次に、q正常に終了をクリックします。または、F(+)を入力してファイルにShift続行することもできますF

注:lessファイルの末尾にのみ移動し、追加された新しいコンテンツを読み込み(「フォロー」)したくない場合は、GShift+ if isはすでに実行されている)代わりに(+ Gin if isはすでに実行されています)コマンドを使用してください。lesslessFShiftFless

less -N +G path/to/some/growing/log_file.log

[ tail -fBusyBoxのベストオプション]

tail通常のLinuxシステムで使用する場合いいえBusyBox実装を含む組み込みLinuxシステムでは、上記のオプションと同じことを行うために「オプション」をtail使用できます。tail--follow=nameless--follow-name

以下は、図のようにBusyBox v1.31.1を使用してテストされていますbusybox --help

busyboxを実行している組み込みLinuxシステムではこのless +Fオプションは使用できません。これらのシステムには以下を使用してくださいtail -f

# Just show new contents as they come into the file
tail -f path/to/some/growing/log_file.log

# Also print the entire file first, starting at the first line (`+1`), before
# following and loading new contents continually
tail +1 -f path/to/some/growing/log_file.log

それほど便利ではありませんが、lessまだうまくいきます。Ctrl+を押すとC出力が終了します。その後、出力を「一時停止」してさらに詳しく調べる必要がある場合は、端末を上にスクロールして前の行を表示できます。ファイルビューを「続行」するには、以前のUp Arrowコマンドを呼び出すとtail -f同じコマンドを簡単に再実行できます。

BusyBoxの他の便利なオプション-s SECONDS-F。前任者:

# only check and load new contents at the end of the file every 2 seconds
tail -f -s 2 path/to/some/growing/log_file.log

完全なヘルプメニューは次のとおりです。

# tail --help
BusyBox v1.31.1 (2021-11-20 02:33:23 UTC) multi-call binary.

Usage: tail [OPTIONS] [FILE]...

Print last 10 lines of each FILE (or stdin) to stdout.
With more than one FILE, precede each with a filename header.

    -f      Print data as file grows
    -c [+]N[kbm]    Print last N bytes
    -n N[kbm]   Print last N lines
    -n +N[kbm]  Start on Nth line and print the rest
    -q      Never print headers
    -s SECONDS  Wait SECONDS between reads with -f
    -v      Always print headers
    -F      Same as -f, but keep retrying

N may be suffixed by k (x1024), b (x512), or m (x1024^2).

watch[BusyBoxでも機能]を使用してください。

これは別のオプションです。これはBusyBoxでもうまく機能します。

# Continually view the last 20 messages of the log file every 1 second
watch -n 1 'tail -n 20 path/to/some/growing/log_file.log'

引用する

  1. 私はless +Fこれを初めて学びました。「less」をオンにして最後までスクロールします。
  2. 私はless +Gこれを初めて学びました。「less」をオンにして最後までスクロールします。
  3. lessオプションについてどこで学びましたか--follow-namehttps://unix.stackexchange.com/a/196349/114401

関連情報