Bash

如何使用 gnu texttools 執行連續的“wc -l”?

  • March 9, 2016

我當然知道

cat logfile.txt | wc -l
120

會告訴我文件中的行數。

然而

tail -f logfile.txt

將向我顯示另一個程序寫入的新行logfile.txt

是否可以將兩者結合起來,以便我使用標准文本實用程序獲得 logfile.txt 的連續更新行數?

我知道

watch wc -l logfile.txt

但我不想每次都重新計算整個文件,這似乎是一種浪費。每隔一秒左右需要一個僅附加的計數,並且可能在行尾使用一個\r而不是一個。\n

也許:

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和一個命令,並非所有外殼都內置。使用while內置,要獲得內置(至少在 Debian 上),您需要在前面添加(無論是否該目錄存在與否)或使用(不要問…))。sleep``ksh93``sleep``wc``/opt/ast/bin``$PATH``command /opt/ast/bin/wc

您可以使用pv,如:

tail -n +1 -f file | pv -bl > /dev/null

但是請注意,當數字超過 1000 時,它會添加k, … 後綴(並且似乎沒有辦法解決這個問題)。M

引用自:https://unix.stackexchange.com/questions/65315