如何即時顯示命令輸出的行數?

如何即時顯示命令輸出的行數?

我將svn export其用作應用程式打包程式腳本的一部分,看起來這個命令與許多其他命令一樣沒有任何類型的進度條。

我目前有兩個選擇:

  • 在沒有選項的情況下使用它,並觀察它列印數千行
  • 使用--quiet,並且在完成之前不會看到任何內容。

有沒有辦法至少即時顯示命令輸出的行數?例如:

Exporting SVN directory ... 1234 files

並且看到這個數字1234 即時增量?我可以想像將輸出通過管道傳輸到一個命令來執行此操作,但是哪個命令呢?

答案1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

或將括號內的部分放入 shell 腳本中。請注意,只有當您的 shell 實際上支援預增量運算子(例如 bash、ksh93 或 zsh)時,這才有效。否則,您將必須遞增$I然後列印它(如 中所示I=$((I+1));printf...)。另外,如果printf不是您的 shell 的內建函數(它是當前 bash 的內建函數),您可以使用echo -neprint -n來代替以獲得更好的效能。您只想抑制換行符號並將 \r 解釋為轉義字元。

答案2

這是一個粗略的想法,但您可以使用該pv命令來計算行數,並將其顯示在螢幕上。 pv在它的許多開關中,有一個-l開關可以對每條線路通過時進行計數。

例子

在這裡,我使用 while 迴圈來模擬 SVN 輸出中的一些檔案。

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

它會繼續覆蓋輸出行,如下所示:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

答案3

您可以在背景將命令作為作業運行,並將其 stdout(以及可選的 stderr)重定向到日誌檔案:command > logfile &其中&指定作業(如果也是 stderr,則用&>代替>)。

然後,您可以使用 wordcount 公用程式來計算日誌檔案中的行數wc -l

要在一個動態變化的行中顯示狀態的變化,您可以使用類似的東西while true; do echo -en '\r'; wc -l logfile; sleep 1; done,但我不能強制 bash 繪製\r回車符來殺死前一行的內容。

看這個問題,它幾乎是重複的:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

相關內容