代码之家  ›  专栏  ›  技术社区  ›  Topher Fangio

缩进bash脚本输出

  •  13
  • Topher Fangio  · 技术社区  · 15 年前

    我正试图编写一个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/ . 我非常感谢任何评论。

    5 回复  |  直到 9 年前
        1
  •  5
  •   CB Bailey    15 年前

    通过任何命令传输Git的输出的问题是Git将检测到输出不是终端,因此它不会输出进度消息,因为(通常)将大量终端字符和进度更新传输到非终端的内容是不有用的。

    要获取进度消息,您需要提供 --verbose 选择权 git clone .进度消息出现在 stderr 所以你很可能需要一根管子 2>&1 | ... .

    请注意,进度消息不会一行一行地出现,但您会得到许多旨在清除同一行的终端转义代码。如果不可能的话,尝试通过类似于sed的基于行的工具来缩进输出可能会很困难。对于一个可以无缓冲地处理输入的程序,应该可以相当容易地查找 ^M 在输出中立即添加一些空格(或制表符),并在收到每批数据时进行刷新。

        2
  •  42
  •   XP84    9 年前

    直通管

    sed "s/^/    /g"
    

    这将用四个空格替换行首的(零宽度)锚点,有效地在行首添加四个空格。

    (G在全球范围内这样做;没有它,它将只做一次,这将做第一行。)

        3
  •  5
  •   hlovdal    15 年前

    您可以过滤您想要通过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。

        4
  •  5
  •   Juliano    15 年前

    另一种不需要SED的解决方案:

    command | (while read; do echo "    $REPLY"; done)
    
        5
  •  2
  •   Mark Rushakoff    15 年前

    由于awk解决方案尚未发布:

    $ echo -en "hello\nworld\n"
    hello
    world
    $ echo -en "hello\nworld\n" | awk '{print "    "$0}'
        hello
        world