次のスクリプトがあります。
#!/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
動作しますが、問題があります。パターンの1つが一致しない場合は知りたいです。どのパターンの不一致。
私も次のことを試しました。
#!/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ずつ減らします。
ループ外で一時変数が設定されていないことを確認してください。つまり、すべてのパターンが見つかって報告されたことを意味します。それ以外の場合は、パターン全体に欠落しているパターンの数を印刷します。