2016-04-28 81 views
-2

我有一個輸入文件input.txt,我想運行一個命令,它應該從input.txt中讀取兩個值。讓我們假設源名稱和目標名稱應該從輸入和相同的命令中讀取,根據input.txt重複數千次。shell腳本多次執行命令從輸入文件讀取值

此外,每個命令的輸出都存儲在單獨的日誌中。這是可能的一個單一的輸入文件,或者我們需要使用2個文件的源和目的地?請求您提供用於實現此目的的shell腳本,因爲我在shell腳本中很差。我嘗試了下面的不工作。

while read i j; do 
    command $i $j 
done > output.txt 

回答

1

當然可以。假設這是input.txt

source1.txt dest1.txt 
source2.txt dest2.txt 
... 

而要做到這一點:

command source1.txt dest1.txt 
command source2.txt dest2.txt 
... 

這裏有一個辦法:

while read i o; do 
    command $i $o 
done < input.txt 

這假定命令command已經構建讀取從它的第一爭論並寫入第二個。如果command改爲打印到標準輸出(即,到終端屏幕),則將command $i $o替換爲command $i > $o。這也假定input.txt中沒有空格或有趣的字符。

如果您的input.txt包含例如百萬行或多個:

awk '{printf "command %s\n", $0}' input.txt | sh 

或者,如果你必須使用command $i > $o

awk '{printf "command %s > %s\n", $1, $2}' input.txt | sh 

這種方法從input.txt中,並打印command source1.txt dest1.txt線的第一線,command source2.txt dest2.txt第二,等...然後它「管」(|)這些命令sh,執行它們。

對於錯誤command處理,嘗試:

while read i o; do 
    command $i $o || command2 $i $o >> command2.log 
done < input.txt 2> error.log 

或者:

done <input.txt> error.log 2>&1 

(其中之一將更好地工作,這取決於是否commandcommand2打印他們的錯誤到標準輸出(1)或者stderr(2)。)

+0

謝謝韋伯,我試過它有效。但是我在某些命令中失敗了,是否有任何方法可以檢查結果,如果失敗了,我們應該在其中輕微修改來運行命令。每條命令執行完日誌詳細信息後都會加載到日誌文件中。像下面一樣讀到i o;做 命令$ I $Ø \t如果結果(好) \t下一個迭代 \t其他 \t命令2 $ I $Ø 做< input.txt >輸出log.txt的 – Hemanth

+0

加入請求的錯誤處理 – webb

0

假設你想在不同的文件不同的輸出,然後在每個命令的每個命令日誌文件和一個錯誤文件:

while read i o; do 
    command $i $o 2>"$i$o.err" >"$i$o.log" 
done < input.txt 

錯誤並登錄同一個文件:stderr被重定向到stdout感謝2>&1

while read i o; do 
    command $i $o 2>&1 >"$i$o.log" 
done < input.txt 

您也可以在所有相同的文件output.log

echo "" > output.log 
while read i o; do 
    command $i $o 2>&1 >> output.log 
done < input.txt