Shell

wc -l 顯示計數的替代方法,因為它接收到行

  • February 18, 2020

wc -l用來計算命令輸出中的行數,因為輸入是通過管道傳遞給它的。

commad | wc -l

這工作正常,但如果command正在做一些繁重的計算,這會很慢。是否有替代方法顯示“到目前為止已通過管道傳輸”的行數?

當我進行某種逐項計算時,這樣的事情會特別有用,比如

cat something | xargs -L1 heavy-per-line-computation | wc -l

我可以手動執行此操作的一種方法是將輸出通過管道傳輸到文件 ( command > file) 並定期cat file | wc -l對其執行。但是一個命令(它不重定向到文件,以避免浪費 I/O)是我所追求的。

awk '{print NR}'

此命令為遇到的每一行列印一個新數字。如果最後一行是完整的,那麼最後一個數字將與所說的一致wc -l。如果最後一行不完整,那麼awk可以計算它(在我的 Kubuntu GNUawk中)但wc -l不會(因為它確實計算換行符);所以可能存在差異。

另一個差異是如果輸入完全為空:wc -l將列印0,我們awk將不列印任何內容。要使其列印,請0使用此變體:

awk '{print NR} END {if (NR==0) print NR}'

或者,也許您希望每個新號碼都覆蓋控制台同一行中的舊號碼。然後這個:

awk '{printf "\r%s",NR} END {print "\r"NR}'

例子:yes | head -n 76543 | awk '{printf "\r%s",NR} END {print "\r"NR}'

請注意,該命令會消耗其輸入(tee可能很方便)。出於監控目的,您可能對以下內容感興趣:

awk '{print NR OFS $0}'

其中(預設OFS為空格)幾乎就像cat -n(如果您cat支持-n)。


pv -l計算行數,它可以在管道內使用。例子:

for i in 1 2 3 4 5; do date; sleep 1; done | pv -l | wc -l

考慮pv -lb相當少的輸出。

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