Shell
wc -l
顯示計數的替代方法,因為它接收到行
我
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
相當少的輸出。