如何限制 bash 中命令输出的行数?

如何限制 bash 中命令输出的行数?

我开始使用在后台下载一个大文件

$ nohup wget http://example.tld/big.iso &

这还给了我一个nohup.out包含wget.

现在,如果我稍后想观看下载过程,我可以使用$ tail -f nohup.out但是它填满我的终端窗口的速度比我希望的要快。我希望看到的是最后一行不断更新(就像wget单独使用时一样)。

我尝试过$ tail -n 1 -f nohup.out,但它似乎只影响最初的尾部。

一般来说,如果可以限制(在本例中为 1)命令输出可用/可见的行数,则可以解决此问题。有点像将输出放在圆形缓冲器- 想想正常的进度条$ wget example.tld/big.iso会打印出来。

有这样的解决办法吗?

还是我爬树的方式不对? (意思是,限制 的nohup输出或做其他事情会更容易吗?)

答案1

如果您不想限制滚动区域(请参阅我的其他答案),您还可以在打印下一行之前使用回车符返回到行首。有一个转义序列可以清除该行的其余部分,当当前行比前一行短时,这是必需的。

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

答案2

您可以watch在这里使用:

watch -n 0.5 -e "tail -n 1 nohup.out"

编辑-e(alias --exec) 选项在这里看起来很合适。特别是如果您的目标是以非常小的间隔运行,这会减少每个周期内部watch运行所造成的开销。sh -cwatch

答案3

有一定的Xterm 控制序列您可以使用它来限制终端滚动的行数。查找“设置滚动区域”。不过,这有点杂乱。请务必在之后重置您的终端:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

答案4

如果您不希望输出占据整个当前终端窗口,您可以使用一个简单的while循环:

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

相关内容