我有以下脚本:
#!/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
将所有模式保存到 in 的数组中patterns=( ... )
,然后循环遍历数组中的模式并使用 grep 检查该模式的匹配情况。如果模式匹配,则默默退出,否则报告未找到模式并增加missed
临时变量减 1。
在循环之外,我们检查是否未设置该临时变量,这意味着找到并报告了所有模式,否则打印总模式中丢失模式的计数。