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
... 后缀(似乎没有办法解决这个问题)。
尝试用 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)