4

我想每隔 N 秒对 mysql 查询应用一个 watch 命令,但希望将结果显示在终端的左下角而不是左上角:

watch -n 120 "mysql_query" | column -t"

显示我的结果如下:

--------------------------
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|                        |
|                        |
--------------------------

而我希望他们有这样的:

--------------------------
|                        |
|                        |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
--------------------------

建议?

4

2 回答 2

3

我没有看到直接的方法来做到这一点,但我设法使用以下方法强制它工作。我还没有完全测试过这个,所以我不能保证这在所有情况下都有效。

使用此脚本:

#!/bin/bash
TERM_HEIGHT=`tput lines`  # determine terminal height
WATCH_BANNER_HEIGHT=2  # account for the lines taken up by the header of "watch"
let VIS_LINES="TERM_HEIGHT - WATCH_BANNER_HEIGHT"  # height of visible area
(yes " " | head -n $VIS_LINES; cat | head -n $VIS_LINES) | tail -n $VIS_LINES

后处理您的命令的输出,因为它被watcheg 调用(假设脚本保存为align_bottom,可执行,并存储在您的某处$PATH):

watch -n 120 "mysql_query | column -t | align_bottom"

脚本的作用:

  1. 确定终端的高度(行数)
  2. 计算watch输出的可见区域
  3. 打印空白行以填充输出(向下推输出)
  4. 从标准输入读入输出,并修剪它,这样我们只在输出超出屏幕时显示输出的顶部。如果您想查看输出的底部,只需删除head之后的命令即可cat
  5. tail步骤(3)和(4)的输出,因此多余的填充被删除,最终输出正好适合watch

我不得不承认这似乎有点骇人听闻,但希望它能让你更接近你想要实现的目标。


更新:

也应该可以将其作为一个函数来实现,以便它可以舒适地放在.bashrc.

function align_bottom() {
  (( VIS = $(tput lines) - 2 ))  # height of visible area
  (yes " " | head -n $VIS; cat | head -n $VIS) | tail -n $VIS
}
typeset -fx align_bottom  # !! make it callable from subshell

用法是一样的:

watch -n 120 "mysql_query | column -t | align_bottom"

请注意,watch使用 运行给定的命令sh -c,因此,正如丹尼斯在评论中指出的那样,在没有链接/bin/sh/bin/bash上面显示的函数方法的系统上将不起作用。

有可能使它工作ussign:

watch -n 120 "mysql_query | column -t | bash -c align_bottom"

但是为了可移植性和可用性,简单地使用 shell 脚本方法会更干净。

于 2012-01-20T14:23:37.157 回答
1

我不知道是否watch可以这样做,但我要做的是使用另一种工具来拥有多个终端并watch根据我的需要调整正在运行的终端的大小。

其中一些有用的工具是:

我希望这有帮助。

于 2012-01-20T12:59:45.577 回答