仅显示命令输出的最近一行

时间:2017-02-16 19:42:41

标签: bash terminal output

如何在一行中打印rm -rv *之类的命令输出?我认为它需要\r,但我无法弄清楚如何。

我需要这样的东西:

自:

removed /path/file1
removed /path/file2
removed /path/file3

收件人:Line 1 : removed /path/file1

然后:Line 1 : removed /path/file2

然后:Line 1 : removed /path/file3

编辑:我可能被误解了,我希望将整个过程打印在同一行中,随着命令输出另一行(如removed /path/file123)<而改变/ p>

EDIT2 :输出有时太长,无法在线显示(非常长的路径)。我也需要一些能够考虑这个问题的东西:
/very/very/very/long/path/to/a/very/very/very/far/file/with-a-very-very-very-long-name1
/very/very/very/long/path/to/a/very/very/very/far/file/with-a-very-very-very-long-name2
/very/very/very/long/path/to/a/very/very/very/far/file/with-a-very-very-very-long-name3

2 个答案:

答案 0 :(得分:2)

这是辅助函数:

shopt -s checkwinsize # ensure that COLUMNS is available w/ window size

oneline() {
  local ws
  while IFS= read -r line; do
    if (( ${#line} >= COLUMNS )); then
      # Moving cursor back to the front of the line so user input doesn't force wrapping
      printf '\r%s\r' "${line:0:$COLUMNS}"
    else
      ws=$(( COLUMNS - ${#line} ))
      # by writing each line twice, we move the cursor back to position
      # thus: LF, content, whitespace, LF, content
      printf '\r%s%*s\r%s' "$line" "$ws" " " "$line"
    fi
  done
  echo
}

使用如下:

rm -rv -- * 2>&1 | oneline

为了更安全地测试一下,可以使用:

for f in 'first line' 'second line' '3rd line'; do echo "$f"; sleep 1; done | oneline

...您会看到该测试显示first line一秒钟,然后second line显示一秒,然后3rd line显示一秒钟。

答案 1 :(得分:1)

如果你想要一个&#34;状态行&#34;结果显示程序输出的最后一行,当行出现时,下一行被写过,你可以通过一个简短的shell发送命令的输出,如下所示:

  YourCommand | while read line ; do echo -n "$line"$'  ...[lots of spaces]... \r' ; done

如果在较长的线后面有较短的线,则需要[很多空格]。短线需要覆盖较长线的文本,否则您将看到长线中的剩余字符。

echo -n $&#39; ...... \ r&#39;在没有换行的情况下向屏幕发送一个文字回车,将位置移回到线的前面,但不会向下移动。

如果您希望命令中的文本只输出1行,那么 通过此sed命令管道任何命令的输出,它应该用空格替换回车符。这将把输出全部放在一行上。如果需要,您可以将空间更改为另一个分隔符。

 your command  | sed ':rep; {N;}; s/\n/ /; {t rep};'

:代表;是一个非命令,用于标记{t rep}命令中的位置。

{N;}会将当前行加入下一行。 它不会删除回车符,而只是将2行放在缓冲区中以用于以下命令。

s / \ n / /;说用空格字符替换回车符。它们的空间在第二个和第三个/字符之间。 您可能需要替换\ r \ n,具体取决于文件是否包含换行符。除非来自个人电脑且尚未转换,否则UNIX文件不会发布。

{t rep};如果在s ///命令中找到匹配,则转到:rep;标记

这将保持连接线,删除\ n,然后跳转到:rep;直到没有更多人喜欢加入。