我有以下格式生成的日志文件。 我想每2分钟grep一次日志并检查错误 使用shell脚本我怎么能得到这个? 任何帮助将不胜感激。
[12:17:02.1274]
[12:18:01.1976]
[12:18:01.2151]
[12:18:01.2152]
[12:18:01.4607]
[12:18:02.6306]
[12:18:03.7299]
[12:18:04.0307]
[12:18:04.1388]
[12:18:04.2068]
[12:18:06.4002]
[12:18:07.5805]
[12:19:01.8559]
[12:19:08.9950]
[12:19:09.2851]
[12:19:10.4704]
[12:19:12.8167]
[12:20:01.8968]
[12:20:01.9206]
[12:20:01.9206]
[12:20:02.1707]
[12:20:02.3064]
[12:20:05.4461]
[12:20:13.7205]
[12:20:14.0807]
[12:20:14.2360]
[12:20:17.3764]
[12:21:01.2299]
[12:21:10.4769]
[12:21:18.8085]
[12:21:19.1106]
[12:21:19.2456]
[12:21:22.3663]
答案 0 :(得分:1)
您可以使用sleep功能。
尝试例如:
#!/bin/bash
echo start
sleep 2
echo end
两个echo命令之间会等待2秒。
您的完整脚本可能是:
#!/bin/bash
while [ 1 ]; do
sleep 2m
if grep -qvE "^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{4}\]" logfile.dat
then
echo "ERROR"
else
echo "Everything is fine..."
fi
done
while-loop 始终在运行,因为1
为true
。在这个无限循环中,每两分钟(2m
)检查就完成了。
修改强>
我更新了代码,以便解析您给出的数据结构。我使用grep
和
-E
启用正则表达式的使用-v
仅匹配反向(意味着它会搜索您的结构,并且如果此模式不匹配,则实际上正在进行重叠)-q
使用安静模式,如果找到匹配则立即退出如果 logfile.dat 与您提供的样式不完全相同,则grep匹配, ERROR 写入STDOUT
,这通常是您的终端
答案 1 :(得分:0)
sed -n "$ s/\[\([0-9.:]*\)\].*/\1/p" | read Marker
while [ 1 ]
do
sleep 120
sed -n "$ s/\[\([0-9.:]*\)\].*/\1/p" | read NewMarker
sed -n "/${Marker/,/${NewMarker}/ p"
Marker="${NewMarker}"
done
它只打印两次标记值(最后一个圆圈为1作为最后一行),另一个在当前周期为1s行。可以将p
替换为/${Marker}/ !p
来修改它。
如果日志永远不会关闭(如果没有发生EOF),则可能无法正常工作,因为sed会等到没有显式退出的情况。