在我作为管理团队成员的集群中,我经常必须检查各种命令的多页标准输出,例如sudo find /
查找任何问题(例如断开的链接)或检查目录树。有时,我需要查看包含项目列表的长文本文件,以查看是否有任何不寻常的名称。
通常,通过管道输出less
,我可以逐页滚动,但我认为如果标准输出滚动得慢一点就足够了,就像电影结尾处的片尾字幕一样。
有没有办法在 bash 或任何其他终端环境中完成此任务?
答案1
光伏发电,管道查看器,将让你每秒打印一行,使用它如下:
cat foo | pv --quiet --line-mode --rate-limit 1
(或者更短,pv -qlL1
)。在 中--line-mode
,--rate-limit
( -L
) 标志定义每秒打印的行数;数字越大,输出越快。
它应该可以在您的发行版的存储库中找到(例如aptitude install pv
获取它)。
答案2
来自 thrig 对 OP 的评论的回答。效果很好。 sleep后更改小数即可修改行间时间。
sudo find / | awk '{system("sleep .5");print}'
使用 ctrl+z 退出,然后终止该作业(使用 bash 时); ctrl+c 仅退出该行。
编辑:
根据下面的评论做了一些研究。该建议awk '{system(sleep.5)||exit;print}'
在我的系统上不起作用,但以下内容似乎允许按 ctrl+c 退出。
awk '{if (system("sleep .5 && exit 2") != 2) exit; print}'
将其放入脚本中或为其指定别名将使您免受腕管的困扰。
答案3
正如之前的答案中所承诺的,一个简单的 C 程序。为什么不?无聊的一天。
较慢.c
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int delay;
char* rem;
if (argc > 1) {
delay = strtol(argv[1], &rem, 10);
} else {
delay = 500;
}
char* line;
size_t bufsize = 0;
struct timespec ts;
ts.tv_sec = delay / 1000;
ts.tv_nsec = (delay % 1000) * 1000000;
while (getline(&line, &bufsize, stdin) != -1) {
printf("%s", line);
nanosleep(&ts, NULL);
}
free(line);
}
用一个漂亮的gcc slower.c -o slower
.如果不带参数使用,每行的毫秒数默认为 500。
用法:sudo find / | ./slower [MILLISECONDS PER LINE]
编辑:由于评论中的输入修复了一些代码。显然, getline 甚至不需要肮脏的 malloc 或任何默认值。让 getline 自己分配垃圾。
编辑 2:删除了不正确的while (!feof(stdin))
用法并添加回 bufsize 初始化中以实现兼容性。
答案4
一个简单的 Go 程序,适度的输出。
// moderare will slow down printing.
//
// $ find ~ | moderare
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"time"
)
var (
sleep = flag.Duration("s", 1*time.Second, "sleep after each line")
br = bufio.NewReader(os.Stdin)
)
func main() {
flag.Parse()
for {
line, err := br.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
time.Sleep(*sleep)
fmt.Printf(line)
}
}