我编写了一个小的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
答案 0 :(得分:0)
您应该使用grep
使用正则表达式过滤所需的行,并grep -v
过滤掉您不想要的行,例如:
ssh root@$serverName grep ERROR $currentFileValue |
grep "$today" |
grep -Ev "($blacklist)"
这假设您的黑名单采用以下格式:foo|bar|qux
。