Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何以给定的行/秒速率生成cat/tac流?_Linux_Shell - Fatal编程技术网

Linux 如何以给定的行/秒速率生成cat/tac流?

Linux 如何以给定的行/秒速率生成cat/tac流?,linux,shell,Linux,Shell,假设您有一个名为“filename”的大日志文件 如果您tail-f filename,则只有当filename自身更新时,您才有一个流 如果您cat filename,则您有一个流,但如果您的CPU为 比英特尔8088更新 如果你cat filename | more那么你有一个一页一页的流,可能会破坏你的空格键 如何以给定的速率(例如:每0.05秒1行)列出一个文件,以便有时间阅读,但我不需要按空格键数百次 (我不使用| grep,因为在我的特殊情况下,我不知道到底要搜索什么)希望这有帮助:

假设您有一个名为“filename”的大日志文件

如果您tail-f filename,则只有当filename自身更新时,您才有一个流

如果您cat filename,则您有一个流,但如果您的CPU为 比英特尔8088更新

如果你cat filename | more那么你有一个一页一页的流,可能会破坏你的空格键

如何以给定的速率(例如:每0.05秒1行)列出一个文件,以便有时间阅读,但我不需要按空格键数百次

(我不使用| grep,因为在我的特殊情况下,我不知道到底要搜索什么)

希望这有帮助:

 cat filename|awk  '{print $0 ; system("sleep 0.05")}'
由于大多数人认为上述解决方案是肮脏的,因此我建议使用以下一种方法:

while read line; do echo $line; sleep 0.05 ; done < filename
读行时
;不要重复$line;睡眠0.05;完成<文件名
我在这里使用
yes
快速获取文本源
pv
是一个非常有用的工具,原因很多,但它的一个特性是一个速率限制器。你需要告诉它保持安静,这样它就不会打印进度指示器。该限制以每秒字节为单位

另请参见:

使用

perl -MTime::HiRes=usleep -pe '$|=1;usleep(300000)'
#or
perl -pe 'select(undef,undef,undef,0.3)'
您可以将上述内容作为shell函数添加到您的
~/.profile
中,例如

慢性子

slowcat() {
    perl -MTime::HiRes=usleep -pe '$|=1;usleep(300000)' "$@"
}
将接受文件名和来自管道的输入

slowcat filenames....
command | slowcat
以下将产生一个典型的电影电脑屏幕或通过300波特调制解调器连接输出

perl -MTime::HiRes=usleep -ne '$|=1;while($c=getc(*stdin)){usleep(33000);print $c}'

也许是这样的:

#!/bin/bash


while read -r line; do 
   echo "$line"; # do whatever you want with line
   sleep 0.05

done < file
#/bin/bash
而read-r行;做
回音“$line”#用这条线做你想做的事
睡眠0.05
完成<文件

在我的系统(Mac OS X、bash)上,这会导致输出流无法被Ctrl-C甚至Ctrl-\取消。肮脏的每0.05秒派生一个新shell不是最好的主意…读取时使用
shell脚本可以-但是
awk
每0.05秒派生一个新shell。。。试试看
system(“sleep 0.05;echo$$”
echo$行
不回显精确的行,但字符串拆分,glob扩展其内容。使用
echo“$line”
或更好的
printf“%s\n'$line”
(例如,它可以正确地处理只包含
-e
-n
的行),而
-r
用于
读取
.)这就是为什么我们需要在超级用户上标记为重复问题的能力。@BenVoigt:是的,我会在这里使用这种能力。事实上,我只是投票结束了这个问题,因为它更适合SU。我理解你的观点,但举个例子,多亏了人们,我有了许多新的(更好的)答案,与John Zwinck提出的前一个问题(只有一个答案,使用perl)。所以我猜重复的问题有时会因为新的回答人而增加价值…@comte:我同意你的观点,新知识是好的,但在这种情况下,我们最终得到了一个在Mac OS X上不能正常工作的awk解决方案(根据我的评论),以及一个Bash解决方案,它为打印的每一行生成一个新的进程!这并不是进步——你接受的答案中的两个解决方案都比我们之前的要糟糕得多。不是你的错——你不知道还有什么更好的。:)@John,关于osx,标记“linux”和“shell”的位置。关于被接受的解决方案,是的,我不知道它是如此耗时,我有一个问题,这是最快的答案,它的工作,所以我接受了!现在,关于这些方法的所有评论,我都不接受答案,让未来的用户得到最好的答案。
slowcat的+1
-我喜欢它!你也能做一个
总计xhaustedcat
吗?:-)@MarkSetchell:)totallyexhaustedcat
太容易了。我做了另一个:
duckcat(){perl-MTime::HiRes=usleep-ne'$|=1;而($c=getc(*stdin)){usleep(33000);print int(rand(10))%9?$c:chr(rand(26)+97)}<“$1”}
:)太有趣了!你应该把它卖了——人们总是想办法让自己在制作YouTube教程视频时看起来像是在终端上键入命令+1对于最简单的方法:)/始终使用
-r
进行
读取
,除非您希望处理转义字符-编辑/此外,请阅读为什么使用
printf
更好。这很糟糕:它会为处理的每一行生成一个新的
睡眠
进程。
#!/bin/bash


while read -r line; do 
   echo "$line"; # do whatever you want with line
   sleep 0.05

done < file