我有一个工具,可以将所有内容输出到一个流中。该工具是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也可以。