我正在尝试实现从错误日志文件读取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
也可以工作,但是嵌套循环中可能出了点问题。我正在以下过程中运行脚本。
我的文件中有一个名为mylogfile.txt
的错误:
[*] Text Text @ level 4: 'Some text' [parent = 'Not found']
然后我有另一个文件,其中插入了例外exception.txt
:
'Not found'
我遍历两个文件以查看是否找到了任何东西:
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"
答案 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
-f FILE ,-file = FILE
- 从 FILE 获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容。
-q ,-安静,-无声
- 安静;不要在标准输出中写任何东西。如果发现任何匹配项,即使检测到错误,也以零状态立即退出。