我正在编写一个bash脚本来检查数组元素是否在文件中。
例如:
我有一系列错误errors=("1234" "5678" "9999")
我有一个包含字符串模式的文件
123400 452612 9999A0 1010EB
我希望循环包含错误的文件,并检查是否有任何数组元素匹配文件中的任何字符串模式。如果确实如此,则返回它在文件中匹配的确切数组模式以进行进一步处理。
关于我如何做到这一点的任何想法?
答案 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.