如何使用 gnu texttools 执行连续的“wc -l”?

tow*_*owi 32 shell bash logs tail text-processing

我当然知道

cat logfile.txt | wc -l
120
Run Code Online (Sandbox Code Playgroud)

会告诉我文件中的行数。

然而

tail -f logfile.txt
Run Code Online (Sandbox Code Playgroud)

将向我显示另一个程序写入的新行logfile.txt

是否可以将两者结合起来,以便我使用标准文本实用程序获得 logfile.txt 的连续更新行数?

我知道

watch wc -l logfile.txt
Run Code Online (Sandbox Code Playgroud)

但我不想每次都重新计算整个文件,这似乎是一种浪费。每隔一秒左右就需要一个仅附加的计数,并且可能在行尾使用一个\r而不是一个\n

Sté*_*las 41

也许:

tail -n +1 -f file | awk '{printf "\r%lu", NR}'
Run Code Online (Sandbox Code Playgroud)

请注意,它会为每一行输入输出一个数字(尽管如果发送到终端会覆盖先前的值)。

或者您可以tail -f在 shell 中手动实现:

n=0
while :; do 
  n=$(($n + $(wc -l)))
  printf '\r%s' "$n"
  sleep 1
done < file
Run Code Online (Sandbox Code Playgroud)

(注意,跑到一个wc和一个sleep每秒并非所有炮弹都内置命令,其中ksh93同时sleep被内置,让在建wc(至少在Debian),你需要添加/opt/ast/bin在前面$PATH(无论是否该目录是否存在)或使用command /opt/ast/bin/wc(不要问......))。

您可以使用pv,如:

tail -n +1 -f file | pv -bl > /dev/null
Run Code Online (Sandbox Code Playgroud)

但请注意,当数字超过 1000 时,它会添加k, M... 后缀(似乎没有办法解决这个问题)。

  • 哇!`pv`——另一个有用的新工具。谢谢一堆。 (2认同)
  • @tombolinux,`awk` 是 `grep` 的超集。`tail -n +0 -f 文件 | awk '/mystring/ {printf "\r%lu", ++n}'` (2认同)

rus*_*ush 7

尝试用 pure 来计算它,bash而没有wc

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo $a ; done
Run Code Online (Sandbox Code Playgroud)

甚至像这样重写以前的值:

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo -ne "\r$a" ; done
Run Code Online (Sandbox Code Playgroud)