Shell-Script

Unix for 循環和 grep 結合 ksh hp-ux

  • June 3, 2016

如果您有 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

注意:需要 GNUgrep才能-Z選擇輸出 NUL 分隔的文件名。

這些行使用grep-l選項輸出包含所需模式( 、 或 )的文件列表maxmilan以及min使用-ZNUL 分隔文件名的選項(以便與任何有效字元的文件名一起使用是安全的)。

這通過管道傳輸到xargs為每個匹配文件執行適當的腳本。

假定這些腳本可以正確處理命令行上的多個文件名參數。如果沒有,請添加-n 1xargs選項中。

例如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 -print0perl -0sort -z處理 xargs -0 任意文件名,即使是那些包含換行符的文件名。

引用自:https://unix.stackexchange.com/questions/286726