27

我试图找到一个关于如何连续显示文件最后几行内容的 Unix 命令(可能是组合)。但是在这个显示过程中,我希望当滚动内容到达屏幕顶部时,一些顶行总是显示在屏幕顶部。

那可能吗?

  1. 假设我有文件“job.sta”,前两行是:
    job name, John's job on 2013-Jan-30,...
    Tab1, Tab2, Tab3
    0, 1, 2,
    1, 90, 89
    2, 89, 23
    ...
    
  2. 这个文件正在运行,它的内容正在增长,我不知道它会在哪一行结束。
  3. 因此,当更新内容到达 Unix shell 屏幕顶部时,我想在使用 tail 命令时显示(总​​是)前 2 行。我目前正在使用 PuTTY。

参考: http ://www.unix.com/unix-dummies-questions-answers/172000-head-tail-how-display-middle-lines.html

4

6 回答 6

63

我一直使用这个功能来监控另一个终端窗口中的日志文件。

tail -f <filename>

我建议向前迈出一步,在日志中查找特定文本。如果您只对看到某些特定条目被写入文件感兴趣,那就太好了。

tail -f <filename> | grep <keyword or pattern>
于 2014-03-27T00:41:47.537 回答
26

这将每 2 秒更新一次,而不是在将数据写入文件时更新,但这可能就足够了:

watch 'head -n 2 job.sta; tail job.sta'
于 2013-01-30T18:11:49.380 回答
8

您可以screen用来模拟预期的行为:

  1. 运行screen,按下Space

  2. Ctrl+a后按S拆分屏幕。

  3. Ctrl+调整顶部窗口的大小,a然后按:resize 4

  4. 在顶部窗口的提示中,输入head -n2 file.

  5. Ctrl+移动到底部窗口,a然后按Tab

  6. Ctrl+开始一个新的屏幕会话,a然后按c

  7. 在新提示中,输入tail -f file.

于 2013-01-30T13:20:49.597 回答
4

我用这个脚本来实现你描述的效果

!#/bin/bash
while [ 1 ]; do ls -lt data | head -n 30; sleep 3; echo -en "$(tput cuu 30; tput ed)"; done

这会在循环中运行一个命令,并在每次迭代之前从屏幕上删除输出的最后几行。

在你的情况下,它看起来像

!#/bin/bash

while [ 1 ] ;# loop forever
do 
    head -n 2 job.sta ;# display first 2 lines 
    tail -n 30 job.sta ;# display last 30 lines from file
    sleep 3 ;# wait a bit
    echo -en "$(tput cuu 32; tput ed)" ;# delete last 32 lines from screen
done

当然在你的文件达到 30 行之前有点难看

希望有帮助

于 2013-01-30T13:01:10.777 回答
2

您需要该multitail程序,它不仅可以分屏,还可以进行颜色编码。

http://www.vanheusden.com/multitail/

于 2013-01-30T18:40:13.880 回答
1

你试试下面的组合 tail -f filename | 头-2

于 2013-01-30T12:51:37.487 回答