我有一个日志文件,每秒都会更新。我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的新手。
答案 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}