检查数组元素是否在文件中

时间:2016-09-29 14:00:04

标签: linux bash shell scripting

我正在编写一个bash脚本来检查数组元素是否在文件中。

例如:

我有一系列错误errors=("1234" "5678" "9999")

我有一个包含字符串模式的文件

123400 452612 9999A0 1010EB

我希望循环包含错误的文件,并检查是否有任何数组元素匹配文件中的任何字符串模式。如果确实如此,则返回它在文件中匹配的确切数组模式以进行进一步处理。

关于我如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:3)

这里只需要调用grep一次:

$ grep -oFf <(printf "%s\n" "${errors[@]}") file
1234
9999

-f选项是指定包含模式的文件。我使用流程替换来&#34;包含&#34;模式,每行一个。

-F选项指定纯文本匹配:我假设你的&#34;错误&#34;数组不会包含正则表达式。

答案 1 :(得分:2)

听起来你只想要一个循环:

for error in "${errors[@]}"; do
    if grep -qE "(^| )$error( |\$)" file; then
        # $error was found in the file
    fi
done

这匹配前面的行或空格开头的错误,后跟空格或行尾。

我努力匹配子字符串中的错误,但如果你不关心,那么你可以将grep命令更改为:

grep -qF "$error" file

如果错误字符串出现在该行的任何位置,则返回成功。

答案 2 :(得分:1)

脚本就是这样,

#/bin/bash
errors=("1234" "5678" "9999")

for error in "${errors[@]}"
do
     grep -o "$error" file
done

对于示例文件,

$ cat file
123400 452612 9999A0 1010EB

脚本生成输出

$ ./script.sh
1234
9999

意味着数组中的上述两个键在文件中匹配。 -o中的grep标志仅用于标识数组中的匹配部分。摘自man grep页。

-o, --only-matching
         Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.