如何“查找并跟踪”文件?

如何“查找并跟踪”文件?

正在按顺序下载文件wget

如果我开始使用 解包cat myfile.tar.bz2 | tar -xj,它可能会正确解包,也可能会因“意外的 EOF”而失败,具体取决于哪个更快。

如何“cat and follow”一个文件,即将文件的内容输出到stdout,但不在EOF时退出,而是保持订阅该文件并继续输出数据的新部分,仅当文件被关闭时才退出writer 并且在 N 秒内未重新打开。


我创建了一个脚本猫并关注基于@arielCo 的回答tail当文件不再被打开进行写入时,也会终止。

答案1

tail +1f file

wget我在下载LibreOffice 源 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 file与 Busybox 一起使用)。

答案2

问题是cat不知道该文件仍在附加中。一旦cat遇到文件的(当前)结尾,它就会退出。

wget为了避免这种情况,您必须写入管道(或 FIFO)。

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

答案3

阅读并关注从开始直到中断的文件:

tail -fn +1 file

为了证明这一点,请尝试以下操作(假设使用 GNU Coreutils 进行 Bash):

(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[我的最爱]

在使用 GNU 版本 487 的 Linux Ubuntu 18.04 上进行测试less,如 所示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.log例如,这对于跟踪名为 的文件很有用,即使轮换日志系统log_file.log.1在轮换到新日志文件以开始记录时将该文件重命名为 。 WithOUT --follow_name,less将继续跟踪该文件log_file.log.1,该文件现在已冻结并且不再增长,而WITH --follow-name, less, 将看到名称更改并自动打开并开始跟踪新log_file.log文件。看这里

显示-N行号。导致在打开符号后+立即less运行命令。+F命令使其不断读取并加载(即:“跟随”)文件末尾,这对于查看不断增长的日志文件的增长特别有用。打开时按F(即:Shift+ F)与按+相同。lessCtrlEnd

less要在运行时中断并停止这种持续加载效果,请按Ctrl+ C。现在您可以像平常一样使用less,上下滚动以根据需要查看数据。然后q像平常一样按退出。或者,您可以通过键入F( Shift+ )继续关注该文件F

注意:要仅打开less并跳转到文件末尾,但不连续加载(“跟随”)添加的新内容,请使用命令G( Shift+ Gin lessif lessis already running) 而不是F( Shift+ Fif lessis already running ):

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

tail -f[BusyBox 上的最佳选项]

请注意,如果tail在常规 Linux 机器上使用,不是具有 BusyBox 实现的嵌入式 Linux 计算机tail,您可以使用tail's--follow=name选项执行与上述less's选项相同的操作。--follow-name

以下是用BusyBox v1.31.1测试的,如图所示busybox --help

less +F选项在运行 busybox 的嵌入式 Linux 系统上不可用,因此对于这些系统,请改用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-name选项:https://unix.stackexchange.com/a/196349/114401

相关内容