다음 스크립트가 있습니다.
#!/bin/bash
result=$(grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat)
if [ -n "$result" ]; then
printf '%s\n' "$result"
else
printf 'No match found for pattern "%s"\n' "$pattern"
fi
작동하지만 문제가 있습니다. 패턴 중 하나가 일치하지 않으면 알고 싶습니다.어느패턴 불일치.
나는 또한 다음을 시도했습니다.
#!/bin/bash
if
grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat
then
echo "All patterns found"
else
echo "Missing pattern"
fi
하지만 같은 문제가 있습니다.
답변1
생각해 보세요:
#!/bin/bash -
patterns=('pattern1' 'pattern2' 'pattern3' 'pattern4' '...')
for pat in "${patterns[@]}"; do
if ! grep -q -e "$pat" infile; then
((missed++))
printf '%s\n' "pattern $pat not found"
fi
done
if [[ -z "$missed" ]]; then
printf '%s\n' 'all patterns were found'
else
printf 'Among %d patterns, %d patterns were not found\n' "${#patterns[@]}" "$missed"
fi
모든 패턴을 의 배열에 저장 patterns=( ... )
한 다음 배열의 패턴을 반복하고 grep을 사용하여 일치하는지 확인합니다. 패턴이 일치하면 자동으로 종료하고, 그렇지 않으면 패턴을 찾을 수 없다고 보고하고 증가합니다.missed
임시 변수를 1씩 감소시킵니다.
루프 외부에서 임시 변수가 설정되지 않았는지 확인합니다. 즉, 모든 패턴이 발견되어 보고되었음을 의미합니다. 그렇지 않으면 전체 패턴에서 누락된 패턴 수를 인쇄합니다.