
내 코드에서 이와 같은 작업을 수행했습니다.
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_nm
grep
/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