0

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

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

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

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

Linux 中是否有开箱即用的工具可以提供帮助?还是我必须编写自定义脚本?

4

3 回答 3

3

我不知道有什么开箱即用的方法,但它是一个非常简单的脚本:

errorRE=$1
while read line
do
    if [[ $line =~ $errorRE ]]
    then printf "%s" "$line" >&2
    else printf "%s" "$line"
    fi
done
于 2013-09-01T15:29:04.083 回答
1

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

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

重击:

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或将其保存在您喜欢的 rc 文件~/.bashrc中。

于 2013-09-01T15:29:14.463 回答
0

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

于 2013-09-01T16:44:39.380 回答