我在写一个bash脚本来检查数组元素是否在文件中。检查数组元素是否在文件中
例如:
我有错误的数组errors=("1234" "5678" "9999")
我有一个包含字符串
123400 452612 9999A0 1010EB
我期待的模式来遍历包含文件的文件错误并检查是否有任何数组元素与文件中的任何字符串模式匹配。如果确实如此,请将它在文件中匹配的确切数组模式返回给我,以供进一步处理。
关于如何做到这一点的任何想法?
我在写一个bash脚本来检查数组元素是否在文件中。检查数组元素是否在文件中
例如:
我有错误的数组errors=("1234" "5678" "9999")
我有一个包含字符串
123400 452612 9999A0 1010EB
我期待的模式来遍历包含文件的文件错误并检查是否有任何数组元素与文件中的任何字符串模式匹配。如果确实如此,请将它在文件中匹配的确切数组模式返回给我,以供进一步处理。
关于如何做到这一点的任何想法?
该脚本是这样的,
#/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.
谢谢伊莲。正是我在找的 –
听起来像是你只是想要一个循环:
for error in "${errors[@]}"; do
if grep -qE "(^|)$error(|\$)" file; then
# $error was found in the file
fi
done
这由线或空间的开始之前的错误匹配,并且后面有一个空格或行的末尾。
我作出了努力,不错误的比赛出场子之内,但如果你不关心,那么你可以改变grep命令是:
grep -qF "$error" file
这将返回成功,如果错误字符串发生在线上的任何地方。
这里有一个方法,你只需要调用grep
一次:
$ grep -oFf <(printf "%s\n" "${errors[@]}") file
1234
9999
的-f
选项是指定一个包含样式的文件。我使用进程替换来“包含”模式,每行一个。
-F
选项指定纯文本匹配:我假设你的“errors”数组不包含正则表达式。
文件中有多个行? (或)与这些固定模式只是一条线? – Inian
错误可以出现在文件的任何位置吗? –
错误可能出现在文件的任何位置。该文件包含多行,它没有固定的长度。 –