并排格式化两个功能的输出

时间:2016-06-22 11:17:28

标签: bash

我想并排格式化两个函数的输出。

以下是我目前正在处理的示例,包括我在底部尝试失败。

#!/bin/bash

status_awsomeproject1() {
    echo "\e[0;33m\n################ Status awsomeproject1 ################\e[0;37m"
    cd /home/joaoc/Projects/awsomeproject1
    git status
    cd vendor/libs
    echo "\e[0;33m\n################ Status awsomeproject1-> lib-1 ################\e[0;37m"
    git -C lib-1 status
    echo "\e[0;33m\n################ Status awsomeproject1-> lib-2 ################\e[0;37m"
    git -C lib-2 status
    echo "\e[0;33m\n################ Status awsomeproject1-> lib-3 ################\e[0;37m"
    git -C lib-3 status
}

status_awsomeproject2() {
    echo "\e[0;33m\n################ Status awsomeproject2 ################\e[0;37m"
    cd /home/joaoc/Projects/awsomeproject2
    git status
    cd vendor/libs
    echo "\e[0;33m\n################ Status awsomeproject2-> lib-1 ################\e[0;37m"
    git -C lib-1 status
    echo "\e[0;33m\n################ Status awsomeproject2-> lib-2 ################\e[0;37m"
    git -C lib-2 status
    echo "\e[0;33m\n################ Status awsomeproject2-> lib-3 ################\e[0;37m"
    git -C lib-3 status
}


echo "$(status_awsomeproject1) || $(status_psp)" | column -t

wrap()命令执行我需要的操作但仅作为单个列执行。

如何实现所需的输出?

谢谢

编辑,以提供最小的工作示例:

#!/bin/bash

string_output1() {
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
}

string_output2() {
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
    echo "################ Example long multi-line string ################\n\n"
}


echo "$(string_output1) || $(string_output2)" | column -t

1 个答案:

答案 0 :(得分:1)

如果您可以使用临时文件,请执行以下操作:

status_awsomeproject1>tmp1
status_awsomeproject2>tmp2
paste tmp1 tmp2
rm tmp1 tmp2 # Remove the temporary files after use

如果您的shell支持[ process substitution ],则可以将上述内容简化为:

paste -d^ <(status_awsomeproject1) <(status_awsomeproject2) 

修改

您可以将结果传递给awk以进行对齐,如下所示:

paste  -d^ <(status_awsomeproject1) <(status_awsomeproject2) | \
awk 'BEGIN{FS="\^"}{printf "%-10s %s\n",$1,$2}' 2>/dev/null

首先,你必须找到一个合适的分隔符,它很少/没有机会出现在函数的输出中。我选择了^。然后,使用此分隔符作为awk字段分隔符,并使用awk printf宽度来控制宽度。

注意:
我已将awk printf宽度设置为10,但您需要根据函数的预期输出长度进行更改。试验和错误,但是nbd。