我写了一个小的 bash 脚本(我的第一个脚本)来解析日志文件并搜索包含当前日期和单词“ERROR”的行,到目前为止它是有效的。 现在我想包括一些类似黑名单的东西来排除脚本找到的一些行。我的问题是,如果黑名单数组中有多个元素,则该行必须包含要排除的所有黑名单数组元素。我想排除至少包含黑名单数组元素之一而不是所有元素的行。
...
for (( i=0; i<$arrayLength; i++ ));
do
serverName=$cluster-$1
currentFile=${1}Logs[$i]
currentFileValue="${!currentFile}"
echo -e "\x1B[100m$serverName: $currentFileValue \x1B[0m"
ssh root@$serverName grep ERROR $currentFileValue |
while read line;
do
if [[ $line =~ .*$today.* ]] && ! [[ $line =~ ${blacklist[@]} ]]
then
echo $line
fi
done
done
...
谢谢你的帮助
编辑:
在考虑了 bfontaine 的建议后,我将脚本缩小到最基本的部分以便于测试。该脚本仅使用黑名单数组的第一个元素。
#!/bin/bash
today=$(date +%Y-%m-%d)
blacklist=("Test1" "Test2")
function check_Logs () {
grep ERROR testfile.txt |
grep "$today" |
grep -Ev "($blacklist)"
}
check_Logs
echo ${blacklist[@]}
“testfile.txt”看起来像
2015-11-09 ERROR Test1
2015-11-10 WARN Test1
2015-11-10 ERROR Test1
2015-11-10 ERROR Test2
2015-11-10 ERROR Test3
2015-11-10 ERROR Test4
2015-11-10 Error Test1
2015-11-11 ERROR Test1
最佳答案
您应该使用 grep
来使用正则表达式过滤您想要的行,并使用 grep -v
来过滤掉您不需要的行,例如:
ssh root@$serverName grep ERROR $currentFileValue |
grep "$today" |
grep -Ev "($blacklist)"
假设您的黑名单格式如下:foo|bar|qux
。
关于linux - bash 查找至少包含一个数组元素的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33629612/