是否可以将gnu的输出与grep并行着色?

时间:2013-08-29 14:35:44

标签: bash scripting parallel-processing

我有一个脚本,可以在多个并行的存储库上运行git命令,这些存储库与gnu并行。我想通过grep传递git命令的输出并为某些部分着色,例如在git status上我希望单词“clean”显示为绿色。有没有办法用gnu parallel和grep做到这一点?

到目前为止,这是我的脚本:

#!/bin/bash

START_DIR=`pwd`
export GIT_ARGS=$*
function do_git() {
    PROJECT_DIR=`dirname $1`
        cd $PROJECT_DIR
    echo ""
        pwd
        git $GIT_ARGS
        echo ""
        cd $START_DIR
}

export -f do_git

find . -maxdepth 2 -type d -name ".git" | sort | parallel --max-procs 4 "do_git {}"

3 个答案:

答案 0 :(得分:4)

尝试将此添加到管道的末尾:

| grep -E --color 'clean|word1|word2|$'

根据需要替换并添加或删除单词。 $导致所有行匹配并通过。 --color选项适用于GNU grep。其他版本的grep可能会使用其他选项。

或者,有several utilities可以进行着色。

一般提示:

  • 避免使用all-caps变量名以防止名称与shell变量冲突
  • 使用$()代替反引号 - 它们更具可读性和更多功能(例如嵌套)
  • 不必使用function关键字
  • 有关尝试使用脚本位置的信息,请参阅BashFAQ/028
  • 我认为不需要导出GIT_ARGS

答案 1 :(得分:1)

要在使用并行时强制grep显示颜色,请尝试grep --color=always

答案 2 :(得分:0)

我会看看我是否可以提出一个关于显示颜色的好建议。

与此同时,我认为你可以像这样改进你的剧本:

#!/bin/bash

function do_git {
    PROJECT_DIR=${1%.git}
    cd "$PROJECT_DIR"
    echo
    pwd
    git "${@:2}"
    echo
}

export -f do_git

find . -maxdepth 2 -type d -name '.git' | sort | parallel --max-procs 4 do_git '{}' "$@"

您不必使用cd“$ START_DIR”进行更改,因为它在子shell中运行(可能并行)并且不会影响调用shell。