Answers:
也许:
tail -n +1 -f file | awk '{printf "\r%lu", NR}'
请注意,它将为输入的每一行输出一个数字(尽管如果发送到终端,它会覆盖先前的值)。
或者,您可以tail -f
在shell中手动实现:
n=0
while :; do
n=$(($n + $(wc -l)))
printf '\r%s' "$n"
sleep 1
done < file
(请注意,它每秒最多可以运行wc
一个sleep
命令,而并非所有shell都内置该命令。使用ksh93
while sleep
内置时,要获得内置命令wc
(至少在Debian上是这样),您需要/opt/ast/bin
在命令前面添加$PATH
(无论是否该目录存在或不存在)或使用command /opt/ast/bin/wc
(不询问...))。
您可以使用pv
,例如:
tail -n +1 -f file | pv -bl > /dev/null
但要注意的是它增加了k
,M
......后缀时数超过1000(和似乎没有被周围的方式)。
tail | awk
解决您的问题。知道您的选择:-n +0
这种结合对我而言不会发生。
pv
-另一个有用的新工具。谢谢一堆。
tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
是的超集grep
。tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
,使awk
在最后打印一个换行符。
我不相信有这样的事情。但是按照以下方式轻松推敲一些东西:
#!/usr/bin/perl
$for_a_while = 1;
$oldcount = -1;
$count = 0;
open($fh, "<", $ARGV[0]);
for (;;) {
for ($curpos = tell($fh); <$fh>; $curpos = tell($fh)) {
$count++;
}
if($count != $oldcount) {
print "$count\n";
$oldcount = $count;
}
sleep($for_a_while);
seek($fh, $curpos, 0);
}
(从抄袭的一般想法perlfunc(1)
)
printf foo >> file
。您需要计算换行符(就像wc -l
我建议的shell解决方案一样),而不是计数的记录<$fh>
。我不认为你需要使用tell
或seek
在所有。
<$fh>
读取由默认的一条线,没有记录。引用的Perl手册指出这样做是为了避免可能的不合作环境(可能取决于文件系统,我猜NFS或其他网络安装的文件系统可能需要一些提示)。
<$fh>
即使它没有以换行符终止,也会返回一条记录。因此,如果perl
位于文件末尾,然后有人执行printf foo >> file
,<$fh>
则将返回foo
(不是一行,因为它没有以换行符终止),$count
即使未向该文件添加任何额外的行,该行也会递增。
cat
输出到wc
也是很大的浪费!