比较包含在bash中的字符串

时间:2019-03-06 12:06:35

标签: bash

我正在尝试实现从错误日志文件读取bash脚本并将字符串与异常进行比较的方法。

我正在尝试将其与if

进行比较
error="[*] Text Text @ level 4: 'Some text' [parent = 'Not found'] "
exception="'Not found'"
if [[ "${error}" == *"${exception}"* ]]; then                                   
    echo "Yes it contains!"
fi

在这种情况下,我希望脚本返回“是的,它包含!”,但是它不能按我预期的那样工作。但是,我的日志中确实也包含特殊字符,有人知道我应该如何处理并进行比较吗?


对我来说,我的if也可以工作,但是嵌套循环中可能出了点问题。我正在以下过程中运行脚本。

  1. 我的文件中有一个名为mylogfile.txt的错误:

    [*] Text Text @ level 4: 'Some text' [parent = 'Not found']
    
  2. 然后我有另一个文件,其中插入了例外exception.txt

    'Not found'
    
  3. 我遍历两个文件以查看是否找到了任何东西:

    while IFS='' read -r line || [ -n "$line" ]; do 
        exception="$line"                       
        while IFS='' read -r line || [ -n "$line" ]; do
            err="$line"                                                 
            if [[ "${err}" == *"${exception}"* ]]; then                                 
                echo "Yes it contains!"
            fi                  
        done < "mylogfile.txt"                  
    done < "exception.txt"
    

2 个答案:

答案 0 :(得分:1)

如果要完全匹配,请使用grep

if grep -q "$exception" <<< "$error"; then
    echo "Yes it contains!"
fi

使用-i开关忽略大小写

答案 1 :(得分:1)

我没有发现您的脚本有任何问题,并且在我运行该脚本时可以正常工作。

也就是说,在shell脚本中逐行循环文件是一种代码味道。有时这是必要的,但通常您可以欺骗一些命令或其他命令来为您完成艰苦的工作。搜索文件时,请考虑使用grep。在这种情况下,您实际上可以通过一个grep摆脱两个循环!

$ grep -f exception.txt mylogfile.txt
[*] Text Text @ level 4: 'Some text' [parent = 'Not found']

要在if语句中使用它,请添加-q以禁止其正常输出,只需检查退出代码即可:

if grep -qf exception.txt mylogfile.txt; then
    echo "Yes, it's contained!"
fi

来自grep(1) man page

  

-f FILE -file = FILE

     
      
  • FILE 获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容。
  •   
     

-q -安静-无声

     
      
  • 安静;不要在标准输出中写任何东西。如果发现任何匹配项,即使检测到错误,也以零状态立即退出。
  •