Shell命令监视文件中的更改-它又叫什么?


Answers:


213

你的意思是

tail -f logfile.log

尾部手册页


6
是的,这是实时的。
亚当·吉本斯

18
旁注:如果您的发行版提供了tailf命令,请优先使用tail -f。tailf效率更高,因为如果未将其写入就不需要访问监视的文件(如果您通过及时更新安装文件系统,则轮询访问会很烦人。)
MihaiLimbăşan,2009年

10
超级用户我找到了答案,建议尾巴-F而非-f,太
拉法

17
tail -F将跟随文件名而不是文件对象,这在日志文件轮换的情况下特别有用。
阿米尔·阿里·阿克巴里

2
几年后更新:tailf现已弃用,并且tail -f很安全。(使用确认在系统上man tailf。)请参见文档:man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

根据乔恩·斯基特(Jon Skeet)的回答,您可能指的是尾巴。

另一个有用的是手表;它允许您定期运行命令并查看全屏输出。例如:

观看-n 10 -d ls -l / var / adm / messages

ls -l /var/adm/messages每10秒运行一次命令,并突出显示后续运行之间的输出差异。(例如,用于观察日志文件的增长速度)。


38

inotifywaitinotify工具,如果你想每次运行一个命令文件(或目录中的所有文件)的变化是非常有用的。例如:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

请注意,这path并不是变量名的最佳选择。在上zsh,环境var似乎不区分大小写。对我来说,设置的path原因PATH也会被设置,这基本上意味着在您修复该问题之前,将不会执行任何操作。开bash,设置path对不起作用PATH
塔纳托斯

36

我更喜欢使用less +FG1tail -f因为我发现自己需要在日志文件中搜索特定的错误或ID。如果我需要搜索某些内容,请键入^C以停止跟踪文件并?开始向后搜索。

键绑定与中的几乎相同vi。可以使用以下+选项在启动时初始化任何命令:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

对于很长的日志,我发现使用-n关闭行号的选项很方便。从联机帮助页:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1.向rgmarcha致敬,以在注释中指出。


请记住为alias您设置一个所需的选项,这样就不必每次都键入它们。
迈克尔·汉普顿

实际上,在大多数情况下,通常应优先使用Shell函数而不是别名。
三人房

21

尾巴很棒...也可以使用更少的开始,例如从文件的开头少一点,然后是myfile少,然后按Shift+ F。这较少充当尾巴。


5
更少的+ F myfile也可以实现
rgmarcha

16

我正在编辑LaTeX文件,并希望监视它的中间位置是否有更改。我整理了以下对我有用的小shell脚本。我希望它也可以派上用场。

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

将其另存为watch.sh并执行chmod u+x watch.sh。然后我按如下方式执行它:

./watch.sh file.tex pdflatex

如果只在实际修改发生后才运行命令,则可以使用`md5sum "$FILE"`代替`ls -l "$FILE"`


1
查看目录及其内容,而不是单个文件:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

您也可以使用inotifywatch / inotifywait钩入内核inotify子系统。这样,您还可以监视“打开”,“关闭”或“访问”之类的内容。

但是,如果您只是想将附加行添加到stdout,则我同意尾巴。


3

尾巴是标准的,传统的,随处可见的unix工具。一个更复杂的工具是multitail,它可以同时监视多个文件并突出显示语法。


3

如果除了尾部文件之外,我还希望能够在文件周围进行搜索,则在“ F”命令中使用较少。

当使用tail时,请记住,如果文件可能被滚动或被edit替换(vim的:w的默认模式),则需要其他参数。

tail -f将导致tail存储文件描述符并遵循它。如果文件被替换,描述符将被更改。遵循文件描述符的好处在于,如果文件被重命名,您仍将遵循它。

tail --follow =将通过定期重新打开命名文件来查看其是否被替换,从而使tail跟踪命名文件。

如果要尾随日志文件但尚未创建该文件,则--retry是另一个有用的选项。

tail -F是--follow = --retry的快捷方式。


2

忘记tailf,diff是您想要的命令。这是一个很好的技巧,可以观察到两个文件之间或正在写入的一个文件之间实时(或接近)发生的差异。

您可以使用这些方法以所需的任何方式修改行为,例如将更改写入文件以保持记录。按以下命令间隔观看或观察其他选项。

您有1个文件,并且要观看对其进行的更改:

所以继承人该怎么做:

  1. 复制文件

cp file file2

  1. 编写bash脚本以查找差异并更新file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. 这是脚本的基本思想。如果需要,可将其写入文件

#!/bin/bash

diff file file2

cp file file2

  1. 接下来,您可以使用手表在屏幕上观看差异

watch ./check-differences

默认情况下,这将每2秒更新一次。因此,如果您需要返回并阅读它们,则将diff的输出写入脚本中的文件中。

或使用cron定期运行脚本(如果您不需要查看输出)。


1

tail -f somefile.txt不断滚动浏览新数据的同时,有时我还是更喜欢less +G somefile.txt查看文件中最新数据的补丁。


4
我认为这已经涵盖了7年前的所有答案
卡巴斯德,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.