如何根据正则表达式模式将流拆分为stdout+stderr



我有一个工具,可以将所有内容输出到一个流中。该工具是Apache Maven。流看起来像:

[INFO] ...
[INFO] ...
[WARNING] ...
[ERROR] ...

我想把它分成两个流,第二个流(stderr)将获得所有以[ERROR]开头的行,第一个流(STD out)将获得其余的行:

$ mvn | splitter "^[ERROR]" 1>stdout.txt 2>stderr.txt

Linux中有现成的工具可以提供帮助吗?或者我必须写一个自定义脚本?

我不知道有什么现成的东西可以做到这一点,但这是一个非常简单的脚本:

errorRE=$1
while read line
do
    if [[ $line =~ $errorRE ]]
    then printf "%s" "$line" >&2
    else printf "%s" "$line"
    fi
done

编写脚本很容易。你只需要逐行比较:

mvn | awk '/^[ERROR]/ { print  > "/dev/stderr"; next; }; 1'

Bash:

mvn | while IFS= read -r LINE; do [[ $LINE == '[ERROR]'* ]] && { echo "$LINE" >&2; continue; }; echo "$LINE"; done

作为一个函数:

function splitter {
    local IFS= LINE
    while read -r LINE; do
        [[ $LINE == '[ERROR]'* ]] && {
             echo "$LINE" >&2
             continue
        }
        echo "$LINE"
    done
}
mvn | splitter

您可以将函数保存为脚本的一部分,并将其来源为. splitter.sh,也可以根据自己的喜好将其保存在类似~/.bashrc的rc文件中。

使用Apache Maven 3.1,日志记录框架已经更改。阅读http://maven.apache.org/maven-logging.html了解所有细节。因此,如果记录器可以将输出拆分到不同的文件中,那么Maven也可以。

相关内容

  • 没有找到相关文章

最新更新