Unix for loopとgrepの組み合わせksh hp-ux

Unix for loopとgrepの組み合わせksh hp-ux

ディレクトリ(特定のファイル.biz)に5〜6個のファイルがあり、一度に1つずつ変数$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

ただし、プログラムは最初の有効な条件を持つすべてのファイルを実行します。

拡張子.bizのファイルが5つある場合、すべてのファイルは最初の有効な条件で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

grep注:オプションで、NULで区切られたファイル名を出力するにはGNUが必要です-Z

この行では、目的のパターン(、、または)を含むファイルのリストを出力するgrepオプションと、ファイル名を区別するためにNULを使用するオプションを使用します。-lmaxmilanmin-Zどの有効な文字)。

xargsこれは、一致する各ファイルに対して適切なスクリプトが実行されるようにパイプで接続されます。

これらのスクリプトは、コマンドラインで複数のファイル名引数を正しく処理すると想定しています。そうでない場合は、オプション-n 1に追加してください。xargs

例えばgrep -lZ max graham/quant/*.biz | xargs -0r -n 1 maximum.sh

からman grep

-l--files-with-matches

通常の出力を抑制します。代わりに、印刷は通常、各入力ファイルの名前を印刷します。検索は最初の一致で停止します。

そして:

-Z--null

通常、ファイル名の後に続く文字の代わりに0バイト(ASCII NUL文字)を出力します。たとえば、grep -lZ通常の改行ではなく、各ファイル名の後にゼロバイトを出力します。

このオプションを使用すると、ファイル名に改行などの珍しい文字が含まれていても出力が明確になります。

find -print0このオプションは、、、、などのコマンドとともに使用して、perl -0任意 のファイル名(改行文字を含む名前も含む)を処理できます。sort -zxargs -0

おすすめ記事