Unix for loop 및 grep 조합 ksh hp-ux

Unix for loop 및 grep 조합 ksh hp-ux

디렉터리(특정 파일 .biz)에 5~6개의 파일이 있고 이를 한 번에 하나씩 변수 $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

일반 출력을 억제합니다. 대신 print는 일반적으로 각 입력 파일의 이름을 인쇄합니다. 검색은 첫 번째 일치에서 중지됩니다.

그리고:

-Z,--null

일반적으로 파일 이름 뒤에 오는 문자 대신 0바이트(ASCII NUL 문자)를 출력합니다. 예를 들어, grep -lZ일반적인 개행 대신 각 파일 이름 뒤에 0바이트를 출력합니다.

이 옵션을 사용하면 파일 이름에 개행과 같은 특이한 문자가 포함된 경우에도 출력이 명확해집니다.

find -print0이 옵션은 , perl -0, 및 sort -z등의 명령과 함께 사용하여 xargs -0 임의의 파일 이름(개행 문자가 포함된 이름도 포함)을 처리할 수 있습니다.

답변2

사용자가 말했듯이 사용 중입니다.고대 유닉스 쉘, 다른 버전의 스크립트를 사용해 보겠습니다.

#!/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

관련 정보