Grep은 bash 스크립트에서 "해당 파일 또는 디렉터리 없음"을 반환하고 수동으로 작업합니다.

Grep은 bash 스크립트에서 "해당 파일 또는 디렉터리 없음"을 반환하고 수동으로 작업합니다.

bash .sh 스크립트를 실행할 때 "grep: 파일 이름: 해당 파일 또는 디렉터리가 없습니다"라는 메시지가 표시됩니다.

명령이 수동으로 실행되고 있습니다. 파일 형식은 "긴 줄이 있는 ASCII 텍스트"입니다. 이로 인해 문제가 발생합니까?

overall_row_count=$(grep -c "^000[1-5]" $filename)
trailer=$(awk 'substr($0,0,4)=="T999" {print}' ${filename})
overall_trailer_count=$(echo "${trailer:29:8}" | sed 's/^0*//')
if [[ ${overall_row_count} == ${overall_trailer_count} ]]
      then 
      echo "Count matches"
      else echo "Count doesn't match"
fi
    
p=53
for i in {0001..0005} 
do 
row_count=$(grep -c "^$i" $filename)  
trailer_count=`echo "${trailer:$p:7}" | sed 's/^0*//'`
p=`expr $p + 7`
if [[ ${row_count} -eq ${trailer_count} ]]; then
    echo "Count matches."
else
    echo "Count doesn't match"
fi
done

-x 출력 설정

++ grep -c '^000[1-5]' BB.CD.20210502.DAT
grep: BB.CD.20210502.DAT: No such file or directory
+ overall_row_count=
++ awk 'substr($0,0,4)=="T999" {print}' BB.CD.20210502.DAT
awk: fatal: cannot open file `BB.CD.20210502.DAT' for reading (No such file or directory)
+ trailer=
++ echo ''
++ sed 's/^0*//'
+ overall_trailer_count=
+ [[ '' == '' ]]
+ echo 'Count matches'
Count matches 
+ p=53
+ for i in '{0001..0005}'
++ grep -c '^0001' BB.CD.20210502.DAT
grep: BB.CD.20210502.DAT: No such file or directory
+ row_count=

++ 에코 '' ++ s

답변1

문제는 텍스트 파일의 긴 줄이 아닐 가능성이 높습니다.

아마도 작업 디렉터리를 변경하거나 $filename의 내용을 놀라운 방식으로 변경하는 상황에서 스크립트가 실행되고 있을 가능성이 높습니다.

$filename이 실행될 때 정확히 무엇인지 확인하기 위해 스크립트에 set -x를 넣어 보셨나요? 이는 몇 가지 단서를 제공할 수 있습니다.

스크립트에 pwd 명령을 추가하면 힌트를 얻을 수도 있습니다.

그래도 올바른 방향으로 갈 수 없다면 위의 제안에서 얻은 정보를 포함하도록 질문을 업데이트하고 좀 더 구체적인 제안을 제공할 수도 있습니다.

답변2

비슷한 문제가 있었는데 grep아무것도 발견하지 못했습니다. 제 경우에는 경로 변수를 생성했기 때문에 발생했으며 dir="~/git/Marlin"사용 grep foo $dir/bar오류가 발생한 후 수정하려면 으로 변경 dir="$HOME/git/Marlin"하고 수정해야 했습니다.

관련 정보