2013-09-01 20 views
0

我有一個工具將所有內容輸出到一個流中。該工具是Apache Maven。流的樣子:如何根據正則表達式模式將流拆分爲stdout + stderr?

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

我想把它分成兩個流,其中第二個(錯誤)將獲得與[ERROR],第一個(標準輸出)開始所有行會得到休息:

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

Linux中是否有可以提供幫助的開箱即用工具?或者我必須寫一個自定義腳本?

回答

3

我不知道任何東西了,做這個盒子的,但它是一個非常簡單的腳本:

errorRE=$1 
while read line 
do 
    if [[ $line =~ $errorRE ]] 
    then printf "%s" "$line" >&2 
    else printf "%s" "$line" 
    fi 
done 
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或按照您的喜好將其保存在像~/.bashrc這樣的rc文件中。