如何仅grep最近匹配的搜索字符串?

时间:2018-02-16 10:12:34

标签: linux bash shell email grep

我有一个日志文件,每秒都会更新。我grep了一些字符串并将搜索结果拉到临时文件中。 然后我将临时文件结果发送到我的电子邮件。 我在cron中运行此脚本。 但是当cron再次触发脚本并且脚本捕获新搜索到的字符串时,它也会在临时文件中向我提供上一个/旧的结果。

例如,我的日志文件如下所示,但不完全是:

2018-02-15 14:36:47,344 INFO : Bread butter jam

2018-02-15 14:37:22,566 INFO : trees

2018-02-15 14:37:22,636 INFO : fruits

2018-02-15 14:37:22,636 INFO : veggies

2018-02-15 14:37:22,745 INFO : junkies

2018-02-15 14:37:23,648 INFO : Bread butter jam

2018-02-15 14:37:23,659 INFO : cakes

2018-02-15 14:37:23,734 INFO : cookies

2018-02-15 14:37:23,767 INFO : meat

2018-02-15 14:37:23,874 INFO : yogurt

每次进入日志文件时,我都希望面包黄油果酱存储在临时文件中。

如何仅将新搜索的结果提取到临时文件?

抱歉我的英语不好,我是bash的新手。

2 个答案:

答案 0 :(得分:2)

如评论中所提到的,您应该将当前日志大小与您在文件中存储的前一个日志长度进行比较。

这样的事情可以解决问题:

#!/bin/bash
CURRENT_LINECOUNT=$(cat /path/to/LogFile | wc - l)
#redirection is here in case the old_count file doesn't exist
OLD_LINECOUNT=$(cat /path/to/old_count 2>/dev/null)

tail -n $((CURRENT_LINECOUNT - ${OLD_LINECOUNT:-0})) /path/to/LogFile | grep "Bread butter jam" > /path/to/temp/file
echo $CURRENT_LINECOUNT > /path/to/old_count

#here, your logic to send the temp file

答案 1 :(得分:1)

当日志文件足够小以便每分钟对字符串进行一次时,您可以使用新行具有不同时间戳的事实。 像

这样的东西
mytmp=/tmp/breakfast.tmp
mylasttmp=/tmp/breakfast.lasttmp
myattachment=/tmp/breakfast.now
test -f ${mytmp} && { echo "Last cron processing still running"; exit 1;}
touch ${mytmp}

grep -E "Bread butter jam" logfile > ${mytmp}

comm -3 ${mytmp} ${mylasttmp} > ${myattachment}
# process ${myattachment} and when that is finished...
mv ${myattachment} ${mylasttmp}
rm ${mytmp}