【问题标题】:Is it possible to colorize the output of gnu parallel with grep?是否可以将 gnu 的输出与 grep 并行着色?
【发布时间】:2013-08-29 14:35:43
【问题描述】:

我有一个脚本,可以在多个存储库上并行运行 git 命令,这些存储库是 gnu 并行的。我想通过 grep 传递 git 命令的输出并为某些部分着色,例如在 git status 上,我希望“干净”这个词显示为绿色。有没有办法用 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 {}"

【问题讨论】:

    标签: bash scripting parallel-processing


    【解决方案1】:

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

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

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

    另外,还有several utilities 可以进行着色。

    一般提示:

    • 避免使用全大写的变量名以防止名称与 shell 变量发生冲突
    • 使用 $() 而不是反引号 - 它们更易读,用途更广泛(例如嵌套)
    • 不需要使用function 关键字
    • 请参阅BashFAQ/028,了解尝试使用脚本的位置
    • 我认为 GIT_ARGS 不需要导出

    【讨论】:

    • 太好了,我尝试了完全相同的策略,但在 git 命令输出的 do_git 函数中。在调用并行之后链接更多的管道可以完美地工作。在将 grep 输出返回到 grep 时,必须将 --color=always 添加到 grep 以保留颜色。
    【解决方案2】:

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

    【讨论】:

    • 这很有趣 - 我在 gnu 并行函数中有 grep 命令,唯一有效的选项是 --color=always。其他 --color 选项不会为匹配着色。
    【解决方案3】:

    我看看能不能给个关于显示颜色的好建议。

    同时我认为你可以像这样改进你的脚本:

    #!/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。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 2016-03-20
      • 2012-04-05
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多