向stdout添加空格

时间:2010-07-20 02:42:54

标签: bash

当我在bash shell脚本中运行命令时,是否可以在stdout(和stderr,如果可能的话)的每个输出的左边添加空格?

我想做点什么:

#!/bin/bash
echo Installing: Something
echo "    => installing prerequisite1"

## INSERT MAGICAL LEFT SPACES COMMAND HERE ##

apt-get install -q -y prerequisite

## ANOTHER MAGICAL CANCELLING LEFT SPACES COMMAND HERE ##

echo "    => installing prerequisite2"
# ... the padding again ...
wget http://abc.com/lostzilla.tar.gz
tar vzxf lostzilla.tar.gz
cd lostzilla-1.01
./configure
make && make install
# ... end of padding ...

echo Done.

有什么想法吗?

编辑:在echo命令中添加引号,否则不会填充。

6 个答案:

答案 0 :(得分:11)

是的,您可以为简单的事情引用它们:

echo '    => installing prerequisite1'

并通过sed管道输出复杂的东西:

tar vzxf lostzilla.tar.gz 2>&1 | sed 's/^/   /'

2>&1将stdout和stderr放到stdout流上,sed用三个空格替换每个行首标记。

这对于wget之类的东西有多好,它可以进行各种各样的光标操作,我不确定。

此处显示的示例:

pax> ls -1 p*
phase1.py
phase1.sh
phase2.py
phase2.sh
primes.c
primes.exe
primes.sh
primes.stat

pax> ls -1 p* | sed 's/^/   /'
   phase1.py
   phase1.sh
   phase2.py
   phase2.sh
   primes.c
   primes.exe
   primes.sh
   primes.stat

我过去使用的一个技巧是确保脚本本身处理缩进:

#!/bin/bash
if [[ "${DONT_EVER_SET_THIS_VAR}" = "" ]] ; then
        export DONT_EVER_SET_THIS_VAR=except_for_here
        $0 | sed 's/^/   /'
        exit
fi
ls -1 p*

如果尚未执行此操作,则会通过sed重新运行缩进脚本。这样,您不必担心更改所有输出语句。我知道,有点黑客攻击,但我倾向于只为快速和脏的shell脚本做必要的事情。

答案 1 :(得分:4)

如果要打开和关闭间距,请使用以下awk脚本:

#!/usr/bin/gawk -f

/^#SPACEON/ { spaces=1; }
/^#SPACEOFF/ { spaces=0; }
!/^#SPACE/ { 
    if(spaces) {
        print "    " $0;
    } else {
        print $0;
    }
}

请注意,您的bash scipt存在轻微问题。值得注意的是,在echo语句中使用=>会将字符=输出到“安装”文件。

#!/bin/bash

echo Installing: Something
echo '=> installing prerequisite1'

echo '#SPACEON'

echo You would see apt-get install -q -y prerequisite

echo '#SPACEOFF'
echo '=> installing prerequisite2'
echo '#SPACEON'


echo You would see wget http://abc.com/lostzilla.tar.gz
echo You would see tar vzxf lostzilla.tar.gz
echo You would see cd lostzilla-1.01
echo You would see ./configure
echo You would see make \&\& make install

echo '#SPACEOFF'
echo Done.

将两者结合起来给了我:

$ ./do-stuff | ./magic-spacing 
Installing: Something
=> installing prerequisite1
    You would see apt-get install -q -y prerequisite
=> installing prerequisite2
    You would see wget http://abc.com/lostzilla.tar.gz
    You would see tar vzxf lostzilla.tar.gz
    You would see cd lostzilla-1.01
    You would see ./configure
    You would see make && make install
Done.

do-stuff是你的bash脚本,而magic-spacing是我上面的awk脚本。

答案 2 :(得分:2)

根据命令写入stdout的方式,您可以使用简单的awk脚本缩进:

$ echo -e 'hello\nworld' | awk '{print "    ",$0}'
     hello
     world

答案 3 :(得分:1)

你可以使用printf执行以下操作:

# space padding for single string
printf "%-4s%s\n" "" "=> installing prerequisite1"

# space padding for single command output
# use of subshell leaves original IFS intact
( IFS=$'\n'; printf "    %s\n" $(command ls -ld * 2>&1) )

# note: output to stderr is unbuffered
( IFS=$'\n'; printf "    %s\n" $(command ls -ld * 1>&2) )

也可以通过将命令括在花括号中来对命令进行分组,并将其输出空间填充,如下所示:

{
cmd1 1>&2
cmd2 1>&2
cmd3 1>&2
} 2>&1 | sed 's/.*/    &/'

答案 4 :(得分:0)

使用exec可以将stdout重定向到stderr脚本/ shell范围...

( 
exec 1>&2
command ls -ld * 
) 2>&1 | sed 's/^/    /'

答案 5 :(得分:0)

使用python pyp(The Pyed Piper):

ls -ld | pyp "'    '+p"