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

标签 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

最佳答案

您应该使用 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/

相关文章:

database - postgresql - 在 mac 上启动 - `pg_ctl` 不工作

shell - 如何使用SSH在远程机器上运行本地shell脚本?

linux - 如何根据文件是否存在递归执行命令

python - skippin 'cutilFunctions.c' Cython 扩展(最新)

linux - 将 puts 的输出同时发送到日志文件和标准输出?

bash - 在 bash 中,如何清除当前输入?

linux - 如何使用 "tail -1 */filename"尾部多个文件的最后一行

linux - Git 空格/行结尾

linux - 如何授予权限,以便用户是唯一可以修改的用户?

java - 直接运行 shell 命令和从 shell 脚本 sh 文件运行的区别