2017-04-12 46 views
0

我有一些傳統的bash代碼,我正在運行並且想要插入應該轉到標準輸出的打印語句。我想將有去標準輸出去out.out和任何將有去stderr去err.err基於內容將輸出重定向到3個不同的文件

運行myCode.sh 2> err.err 1> out.out將打印出來一切正常,但我想放像echo "NewStatement: I am at this point in the code"打印報表,然後以某種方式預grep命令NewStatement並將其發送到標準輸出,而其他一切正常得到處理。

在本質上我想:

1)在含有NewStatementstdoutstdout含有NewStatement發送任何東西stdout

2)發送什麼out.out

3)發送任何東西在stderrerr.err

這可能嗎?

回答

0

這很容易。首先,「初學者」解決方案。

創建wrapper腳本(或包裝功能的主腳本),這將包含這樣的事情:

#!/bin/bash 

while read line || [[ $line ]] 
do 
    if 
    [[ $line =~ NewStatement ]] 
    then 
    echo "$line" 
    else 
    echo "$line" >> out.out 
    fi 
done< <("[email protected]" 2>err.err) 

然後,只需打電話給你這樣的腳本(假設一切都是可執行文件,在當前目錄:

./wrapper myCode.sh 

模式「先進」的解決方案使用文件描述符打開目標文件進行寫入。

#!/bin/bash 

exec 3> out.out # Open file descriptor 3 for writing to file 

while read line || [[ $line ]] 
do 
    if 
    [[ $line =~ NewStatement ]] 
    then 
    echo "$line" 
    else 
    echo "$line" >> &3 
    fi 
done< <("[email protected]" 2>err.err) 

exec 3>&- # Close file descriptor 

您可以有許多文件描述符根據任意複雜的條件執行輸出到許多單獨的文件。

1

你可以這樣說:

>out.out 

./myCode.sh 2> err.err 1> >(awk '!/^NewStatement/{print > "out.out"; next} 1') 

awk命令內部進程替換打印到out.out如果行不NewStatement啓動。否則,以NewStatement開頭的行將打印到stdout

1

或者,您可以

myCode.sh 2>err.err | tee >(grep -v NewStatement > out.out) | grep NewStatement 

tee從他stdin複製一切,所以

  • 發球-ED流由grep -v patt過濾(如不含)和重定向
  • stdout if if grep patt(eg僅包含當線)

這可以重複任何次,像

cmd | tee >(cmd1) >(cmd2) >(cmd3) | cmd 
相關問題