假設我有一個命令cmd1,它從標準輸入中讀取一行輸入併產生一行輸出。我也有另一個命令cmd2,它產生多行輸出。我如何在Linux中管理這兩個命令,以便cmd2生成的每一行執行cmd1?如果我只是這樣做:管道只讀取一行輸入的程序的最佳方法
# cmd2 | cmd1
cmd1將只採用cmd2的第一行輸出,產生一行輸出,然後關閉。我知道我可以使用像perl這樣的解釋器來完成這項工作,但是我不知道是否有一種乾淨的方法只用bash腳本來完成。
感謝
假設我有一個命令cmd1,它從標準輸入中讀取一行輸入併產生一行輸出。我也有另一個命令cmd2,它產生多行輸出。我如何在Linux中管理這兩個命令,以便cmd2生成的每一行執行cmd1?如果我只是這樣做:管道只讀取一行輸入的程序的最佳方法
# cmd2 | cmd1
cmd1將只採用cmd2的第一行輸出,產生一行輸出,然後關閉。我知道我可以使用像perl這樣的解釋器來完成這項工作,但是我不知道是否有一種乾淨的方法只用bash腳本來完成。
感謝
你可以使用一個while
循環是這樣的:
#! /bin/bash
IFS=$'\n'
while read -r line ; do
echo "$line" | cmd1
done < <(cmd2)
是以行保留空白。 (-r
在read
是要進入"raw" mode以防止反斜線解釋。)
cmd2 | while read line; do echo $line | cmd1; done
我有一種感覺,多個cmd1
可以並行運行。
如果你有GNU並行http://www.gnu.org/software/parallel/安裝,你可以這樣做:
cmd2 | parallel --pipe -N1 cmd1
你可以安裝GNU並行只需:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
手錶GNU並行的介紹視頻,瞭解更多: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
cmd2 | awk '{ system("echo " $1 " | cmd1") }'
可用例如,我驗證所有站點上.htaccess
文件的所有權/權限。
find /var/www/html/ -name .htaccess | awk '{ system("ls -lA " $1) }'
作爲預留足夠的while循環發佈,我建議你看看xargs的和/或GNU平行的,因爲它會完成同樣的事情,而你給你更多的選擇,如在平行 – frankc
運行CMD1 @ frankc,如果'cmd1'採用了命令行參數,xargs會很有幫助,但是當它從read中讀取stdin時可能是最簡單的解決方案。 –
@glenn當然你是對的。我真的沒有想到 – frankc