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



如何在一行中打印像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)

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

下面是一个辅助函数:

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%sr' "${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%*sr%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一秒钟。

如果你想要一个"状态行"结果,显示程序输出的最后一行,当它出来时,该行被下一行覆盖,你可以通过一个短shell发送命令的输出,而

循环如下:
YourCommand | while read line ; do echo -n "$line"$'  ...[lots of spaces]... r' ; done

需要[大量空格],以防较短的行在较长的行之后出现。 短行需要覆盖较长行中的文本,否则您将看到长行中的剩余字符。

echo -n $' ... \r' 将不带换行符的文字回车符发送到屏幕,该回车会将位置移回行的前面,但不向下移动一行。

如果您希望命令中的文本仅输出在 1 长行中,则 通过此 sed 命令通过管道传输任何命令的输出,它应将回车符替换为空格。 这会将所有输出放在一行上。 如果需要,您可以将空格更改为另一个分隔符。

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

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

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

s///; 表示将回车符替换为空格字符。它们的空格位于第二个和第三个/字符之间。 您可能需要替换 \r,具体取决于文件是否具有换行符。UNIX 文件不会,除非它们来自 PC 并且尚未转换。

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

这将继续连接行,删除 ,然后跳转到 :rep;,直到没有更多的喜欢加入。

最新更新