Shell-Script
Unix for 循環和 grep 結合 ksh hp-ux
如果您有 5 或 6 個文件,特定文件 .biz 在一個目錄中,並且您想將它們一次儲存在一個變數 $file 中,並應用一組命令直到在目錄中找不到更多 .biz 文件怎麼辦.
我試著用
for f in graham/quant do if grep "max" $file; then maximum.sh $file elif grep "milan" $file; then milan.sh $file elif grep "min" $file; then minimum.sh $file . . . else echo " keep working you are close " fi done
但是程序會執行第一個有效條件的所有文件。
如果您有 5 個副檔名為 .biz 的文件,所有這些文件都將在第一個有效條件下執行 5 次。
輸出將是:
Milan Milan Milan Milan Milan
代替
Milan Minimum Maximum . .
有任何想法嗎?
正如使用者所說,它使用的是古老的 unix shell,讓我們嘗試另一個版本的腳本:
#!/bin/sh #test version for ancient shell. cd graham/quant for file in *.biz do grep -q "max" "$file" if [ "$?" = "0" ]; then maximum.sh "$file" fi grep -q "milan" "$file" if [ "$?" = "0" ]; then milan.sh "$file" fi grep -q "min" "$file" if [ "$?" = "0" ]; then minimum.sh "$file" fi done cd $OLDPWD
grep -lZ max graham/quant/*.biz | xargs -0r maximum.sh grep -lZ milan graham/quant/*.biz | xargs -0r milan.sh grep -lZ min graham/quant/*.biz | xargs -0r minimum.sh
注意:需要 GNU
grep
才能-Z
選擇輸出 NUL 分隔的文件名。這些行使用
grep
’-l
選項輸出包含所需模式( 、 或 )的文件列表max
,milan
以及min
使用-Z
NUL 分隔文件名的選項(以便與任何有效字元的文件名一起使用是安全的)。這通過管道傳輸到
xargs
為每個匹配文件執行適當的腳本。假定這些腳本可以正確處理命令行上的多個文件名參數。如果沒有,請添加
-n 1
到xargs
選項中。例如
grep -lZ max graham/quant/*.biz | xargs -0r -n 1 maximum.sh
來自
man grep
:
-l
,--files-with-matches
抑制正常輸出;而是列印通常會從中列印輸出的每個輸入文件的名稱。掃描將在第一次匹配時停止。
和:
-Z
,--null
輸出一個零字節(ASCII NUL 字元)而不是通常跟在文件名後面的字元。例如,
grep -lZ
在每個文件名之後輸出一個零字節,而不是通常的換行符。此選項使輸出明確,即使存在包含不尋常字元(如換行符)的文件名。
此選項可與 、 、 和 等命令一起使用
find -print0
,perl -0
以sort -z
處理xargs -0
任意文件名,即使是那些包含換行符的文件名。