파일이 존재하지 않는 경우에도 grep 작업을 수행하는 방법은 무엇입니까?

파일이 존재하지 않는 경우에도 grep 작업을 수행하는 방법은 무엇입니까?

내 코드에서 이와 같은 작업을 수행했습니다.

file_nm=`ls -latr *abc*`
if [ `grep "search_txt" "$file_nm" | wc -l` -gt 0 ]
then
  echo "string found"
else
  echo "string not found"
fi

file_nm공백으로 확인 되면 내 코드가 grep예상되기 때문에 중단됩니다 file_nm. 이 코드를 어떻게 작동하게 만들 수 있나요? grep파일이 존재하지 않는 경우 명령을 우회할 수 있는 옵션이 있습니까?

답변1

노력하다:

grep "search_txt" /dev/null "$file_nm"

/dev/null처리할 수 있는 파일이 항상 하나 이상 있기 때문에 피드를 사용하면 존재하지 않더라도 작동하게 됩니다 .grep$file_nmgrep/dev/null

답변2

이를 상당히 단순화할 수 있습니다.짜증나는 질문다음을 수행하여 ls(고유)를 구문 분석합니다.

file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
      echo "string found" ||
      echo "string not found"

그러나 원래 예와 같이 일치하는 파일이 여러 개 있는 경우 *abc*다음을 사용합니다.

for i in *abc*; do 
    grep -q "search_txt" "$i" && 
        echo "string found in $i" || 
        echo "string not found in $i"
done 

여러 파일의 일치에 신경 쓰지 않고 일치하는 파일 중 *abc*문자열이 포함되어 있는지 알고 싶다면 search_txt다음을 수행하면 됩니다.

grep -q "search_txt" *abc* &&  echo "string found" || echo "string not found"

답변3

다음과 같은 몇 가지 문제가 있습니다.

  • 게시한 코드가 중단되지 않습니다.
  • 등의 이름을 가진 파일을 찾는다는 의미의 -l플래그를 사용합니다 .ls-rw-r--r--
  • ls출력을 완전히 구문 분석하는 것은 피해야 합니다.

그리고 테스트 출력은 필요하지 않으며 grep종료 상태만 사용할 수 있습니다. 에서 man grep:

 EXIT STATUS
       The exit status is 0 if selected lines are found, and 1 if not found.

동일한 작업을 수행하는 단순화된 버전은 다음과 같습니다.

if grep -q "search_txt" *abc*
then
  echo "string found"
else
  echo "string not found"
fi

답변4

당신은해야$file_nm비어 있는지 테스트grep을 실행하기 전에

if [ -n "$file_nn" ];

$file_nm이 비어 있지 않으면 True를 반환합니다.

관련 정보