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都内置该命令。使用ksh93while 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也是很大的浪费!