我正在尝试编写一个bash脚本,但我很难让输出看起来整洁有序。我可以使用换行符,但我宁愿让输出易于阅读。例如,当我运行git clone ...
时,我想首先回显“克隆存储库”,然后输出git
缩进。示例输出:
Cloning repository...
Initialized empty Git repository in /root/client_scripts/jojo/.git/
remote: Counting objects: 130, done.
remote: Compressing objects: 100% (121/121), done.
remote: Total 130 (delta 13), reused 113 (delta 6)
Receiving objects: 100% (130/130), 176.07 KiB, done.
Resolving deltas: 100% (13/13), done.
目前,它都是压缩而没有缩进。有谁知道如何做到这一点?我尝试使用sed
和awk
,但它似乎没有显示任何更多的输出而不仅仅是Initialized empty Git repository in /root/client_scripts/jojo/.git/
。我非常感谢任何评论。
答案 0 :(得分:42)
管道穿透
sed "s/^/ /g"
这将用行开始的(零宽度)锚替换四个空格,在行的开头有效地添加四个空格。
(g在全球范围内执行此操作;没有它,它只执行一次,这将执行第一行。)
答案 1 :(得分:5)
您可以通过sed过滤要缩进的命令的输出。
/tmp/test>cat script
#!/bin/sh
echo "Running ls -l"
ls -l 2>&1 | sed 's/^/\t/'
/tmp/test>sh script
Running ls -l
total 4
-rw-rw-r-- 1 hlovdal hlovdal 55 2009-11-03 23:36 script
/tmp/test>
sed命令将用制表器替换行的开头(在第一个字符之前),即在行的最开头插入制表符。
更新为缩进stderr。
答案 2 :(得分:5)
不需要sed的其他解决方案:
command | (while read; do echo " $REPLY"; done)
答案 3 :(得分:5)
通过任何命令管道git输出的问题是git会检测到输出不是终端,因此它不会输出消息,因为(通常)管道整个数据没用终端字符和进度更新到不是终端的东西。
要获取进度消息,您需要向--verbose
提供git clone
选项。进度消息显示在stderr
上,因此您可能需要管道2>&1 | ...
。
请注意,进度消息不会逐行显示,但是您将获得许多旨在清除同一行的终端转义码。尝试通过像sed这样的基于行的工具进行管道来缩进此输出可能会很难,如果不是不可能的话。对于可以处理无缓冲输入的程序,应该可以在输出中查找^M
并立即向后添加一些空格(或选项卡),并在收到每批数据时频繁刷新。 / p>
答案 4 :(得分:2)
由于awk解决方案尚未发布:
$ echo -en "hello\nworld\n"
hello
world
$ echo -en "hello\nworld\n" | awk '{print " "$0}'
hello
world