bash查找包含至少一个数组元素的行

时间:2015-11-10 12:06:12

标签: linux bash shell command-line

我编写了一个小的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

1 个答案:

答案 0 :(得分:0)

您应该使用grep使用正则表达式过滤所需的行,并grep -v过滤掉您不想要的行,例如:

ssh root@$serverName grep ERROR $currentFileValue |
    grep "$today" |
    grep -Ev "($blacklist)"

这假设您的黑名单采用以下格式:foo|bar|qux