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


11

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

$ 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输出或执行其他操作会更容易吗?)

Answers:


10

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

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;

6

您可以watch在这里使用:

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

编辑:(-e别名--exec)选项在这里看起来合适。特别是如果您希望以watch很小的间隔运行,则可以减少每个周期sh -c内部运行所引起的开销watch


2
请注意,这tail每秒都会产生一个新的进程,您可能会或可能不会在乎。另外,请确保指定一个亚秒间隔(例如watch -n 0.1)来模拟“不断更新”的部分。(这显然也增加了进程和文件打开调用的数量。)最后,如果您使用的是OS X,则可以watch从MacPorts 获取,因为默认情况下它不可用。
janmoesen 2011年

这有点变通,但是很棒。我期待非全屏答案,以便看到以前的输出-但实际上我可以watch在新的终端窗口中使用。我还发现使用至少tail -n 2比1秒的间隔要多于-n 1with ,因为否则可能看不到最新的百分比。这不是您的答案中的缺陷,但是如果其他人决定观看wgets尾随nohup输出,则我提到了它。wgetwatch
哈里·凯纳嫩(JariKeinänen)2011年

@janmoesen在这种特定情况下,拥有一个新的tail流程可能并不过分。但作为一个一般性的答案,这是可以考虑的。我还指出,这watch -n 0.1没有用,但是watch -n 0,1可以用-可能已经应用了语言环境,尽管以前我还没有看到将语言环境应用于终端命令选项。附带说明:brew install watch也很出色:-)
JariKeinänen2011年

注意:是否watch可以使用0,10.1取决于您的语言环境设置(它使用为您的语言环境定义的小数点符号)。检查LC_ALL=C watch -n 0.1 "date +%S.%N"
rozcietrzewiacz 2011年

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.

<在此处插入有关不可移植性的常规注释>
janmoesen 2011年

这是另一种很好的选择,但是也可以在专用窗口中使用,因为tail -f仍然需要填充缓冲区,并且因为无论如何终端都需要重新设置。这不是我希望的那样内联,但否则可能是我想要的。
哈里·凯纳嫩(JariKeinänen)2011年

0

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

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

1
注意,要在运行任何产生输出的命令时能够滚动终端输出,您需要编辑终端仿真器设置并禁用scrollTtyOutput(或类似)选项。
rozcietrzewiacz 2011年
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.