我想知道是否有更好的方法来拆分日志文本文件而不是执行下面的shell循环,理想情况下使用单个shell命令。
日志文件如下所示:
2016-11-20T16:19:21+00:00 Logging started
2016-11-20T16:20:41+00:00 System is up
2016-11-20T16:21:07+00:00 Unknown event 45
...
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
...
2016-11-27T11:32:00+00:00 System powering down
因此,我们要完成的任务是在给定时间拆分文件。 假设我只保留上周的条目,以避免不断增长的综合症。
因此,日期为“2016-11-25T08:41:00 + 00:00”,我希望仅保留该日期之后的那些条目。 请注意,我们要剪切文件的日期不一定与现有条目相对应(如示例中所示)。
所以,我能做的最好的事情是这样的一段代码:
WHEN='2016-11-25T08:41:00+00:00' # actually that is read as a parameter
while read line; do
if [ "${line}" \> "${WHEN}" ]; then
echo "${line}"
fi
done <"${LOGFILE}" >"${CUTFILE}"
这样可行,但由于它是一个shell循环,如果文件变得非常大,它可能会很慢。
那么,使用标准命令/实用程序有什么更好的建议吗?
答案 0 :(得分:3)
您可以使用以下命令:
tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile
grep的-m1选项将匹配模式的第一次出现(2016-11-25),-n将打印相应的行号以及匹配的模式。
例如来自上面的日志文件
root@ubuntu:/home# cat logfile
2016-11-20T16:19:21+00:00 Logging started
2016-11-20T16:20:41+00:00 System is up
2016-11-20T16:21:07+00:00 Unknown event 45
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:39:02+00:00 Blah blah
2016-11-25T08:39:04+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
2016-11-27T11:32:00+00:00 System powering down
点击所需的模式“2016-11-25”
root@ubuntu:/home# cat logfile | grep -m1 -n "2016-11-25"
4:2016-11-25T08:40:00+00:00 Blah blah
取上述输出的第一个值使用cut命令和分隔符“:”
root@ubuntu:/home# cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1
4
并将其传递给tail命令,“tail -n +”以获取所需的输出
root@ubuntu:/home# tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile
2016-11-25T08:40:00+00:00 Blah blah
2016-11-25T08:39:02+00:00 Blah blah
2016-11-25T08:39:04+00:00 Blah blah
2016-11-25T08:42:00+00:00 Blah blah
2016-11-27T11:32:00+00:00 System powering down