未找到 bash 脚本模式

未找到 bash 脚本模式

我有以下脚本:

#!/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。

在循环之外,我们检查是否未设置该临时变量,这意味着找到并报告了所有模式,否则打印总模式中丢失模式的计数。

相关内容