it-swarm.cn

Shell命令监视文件中的更改

我知道Unix上有一个命令可以用来监视文件并查看正在写入的更改。这对于检查日志文件特别有用。

你知道这叫什么吗?

167
Sebastian Hoitz

你的意思是

tail -f logfile.log

尾部手册页

220
Jon Skeet

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

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

 watch -n 10 -d ls -l /var/adm/messages

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

128
Murali Suriar

如果要在每次更改文件(或目录中的任何文件)时都运行命令,则使用 inotify-toolsinotifywait很有用。例如:

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

我更喜欢使用less +FG1个 超过tail -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 上添加提示以在注释中指出。

37
Jon Ericson

尾巴很棒...也可以使用更少的文件开头,即更少的myfile然后按 Shift+F。这较少充当尾巴。

21
trent

我正在编辑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.shchmod u+x watch.sh。然后我按如下方式执行它:

./watch.sh file.tex pdflatex

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

16
oliphaunt

您可以使用 tailf 命令非常简单

tailf logfile.log
8
reegan vijay

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

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

6
Martin

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

3
hlovdal

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

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

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

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

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

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

3
deinspanjer

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

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

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

所以继承人该怎么做:

  1. 复制文件

    cp file file2
    
  2. 编写bash脚本以查找差异并更新file2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. 这是脚本的基本思想。如果需要,可将其写入文件

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. 接下来,您可以使用手表在屏幕上观看差异

    watch ./check-differences
    

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

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

2
Mezmer

tail -f somefile.txt不断滚动查看新数据,我有时喜欢less +G somefile.txt也可以查看文件中的最新数据补丁。

1
phantomastray