Unix for 循环和 grep 组合 ksh hp-ux

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
  .
  .

有任何想法吗?

答案1

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输出包含所需模式(maxmilanmin)的文件列表,以及-Z使用 NUL 分隔文件名的选项(以便可以安全地使用带有任何有效字符)。

这是通过管道输入的,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 -print0此选项可与、perl -0sort -z、 和 等命令一起使用xargs -0 来处理任意文件名,甚至包含换行符的文件名。

答案2

正如用户所说,它正在使用一个古老的 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

相关内容