2016-09-29 56 views
-1

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

例如:

我有错误的数组errors=("1234" "5678" "9999")

我有一个包含字符串

123400 452612 9999A0 1010EB

我期待的模式来遍历包含文件的文件错误并检查是否有任何数组元素与文件中的任何字符串模式匹配。如果确实如此,请将它在文件中匹配的确切数组模式返回给我,以供进一步处理。

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

+0

文件中有多个行? (或)与这些固定模式只是一条线? – Inian

+0

错误可以出现在文件的任何位置吗? –

+0

错误可能出现在文件的任何位置。该文件包含多行,它没有固定的长度。 –

回答

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 

意味着从阵列上述两个键具有在文件中匹配。 grep中的-o标志仅用于识别阵列中的匹配部件。摘自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. 
+0

谢谢伊莲。正是我在找的 –

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 

这将返回成功,如果错误字符串发生在线上的任何地方。

3

这里有一个方法,你只需要调用grep一次:

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

-f选项是指定一个包含样式的文件。我使用进程替换来“包含”模式,每行一个。

-F选项指定纯文本匹配:我假设你的“errors”数组不包含正则表达式。