能否使用grep给gnu parallel的输出着色?

4
我有一个脚本,使用gnu parallel在多个存储库上运行git命令。我想通过grep过滤git命令的输出并着色某些部分,例如对于git状态,我希望单词“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个回答

4
尝试将此添加到您的管道末尾:
| grep -E --color 'clean|word1|word2|$'

替换、添加或删除必要的单词。 $ 导致所有行都匹配并通过。 --color 选项适用于 GNU grep。其他版本的 grep 可能使用不同的选项。
另外,有几个实用工具可以进行颜色处理。
一般提示:
  • 避免使用全大写变量名称以防止与 shell 变量发生名称冲突
  • 使用$()而不是反引号-它们更易读且更灵活(例如嵌套)
  • 使用function关键字是不必要的
  • 请参见BashFAQ/028,了解如何尝试使用您的脚本位置
  • 我认为不需要导出 GIT_ARGS

1
非常好,我尝试了完全相同的策略,但是在我的 do_git 函数中使用 git 命令的输出。在调用 parallel 后再链接几个管道就可以完美地工作了。必须添加 --color=always 到 grep 中以保留颜色,当将 grep 输出返回到 grep 时。 - Greg

2
为了让并行处理时的grep显示颜色,可以尝试使用grep --color=always

很有趣-我在gnu并行运算中的一个函数里有“grep”命令,并且唯一有效的选项是“--color=always”。其他“--color”选项不能给匹配着色。 - Petr Javorik

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接