2012-05-04 18 views
2

假設我有一個命令cmd1,它從標準輸入中讀取一行輸入併產生一行輸出。我也有另一個命令cmd2,它產生多行輸出。我如何在Linux中管理這兩個命令,以便cmd2生成的每一行執行cmd1?如果我只是這樣做:管道只讀取一行輸入的程序的最佳方法

# cmd2 | cmd1 

cmd1將只採用cmd2的第一行輸出,產生一行輸出,然後關閉。我知道我可以使用像perl這樣的解釋器來完成這項工作,但是我不知道是否有一種乾淨的方法只用bash腳本來完成。

感謝

+0

作爲預留足夠的while循環發佈,我建議你看看xargs的和/或GNU平行的,因爲它會完成同樣的事情,而你給你更多的選擇,如在平行 – frankc

+0

運行CMD1 @ frankc,如果'cmd1'採用了命令行參數,xargs會很有幫助,但是當它從read中讀取stdin時可能是最簡單的解決方案。 –

+0

@glenn當然你是對的。我真的沒有想到 – frankc

回答

7

你可以使用一個while循環是這樣的:

#! /bin/bash 
IFS=$'\n' 
while read -r line ; do 
    echo "$line" | cmd1 
done < <(cmd2) 

是以行保留空白。 (-rread是要進入"raw" mode以防止反斜線解釋。)

+0

+1照顧我忽略的細節。 – chepner

+0

+1需要引用''$ line'' –

+0

Thanks @glenn。 (IFS防止分詞,但沒有考慮過globbing ...) – Mat

1
cmd2 | while read line; do echo $line | cmd1; done 
0
cmd2 | awk '{ system("echo " $1 " | cmd1") }' 

可用例如,我驗證所有站點上.htaccess文件的所有權/權限。

find /var/www/html/ -name .htaccess | awk '{ system("ls -lA " $1) }'