我想知道是否有比执行下面的 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
- 所有行都以 ISO8601 日期标记 (UTC) 开头
- 这些行按构造的时间顺序排列,因为当有事件要记录时,行会被附加。
- 文件正在增长
因此,我们要完成的任务是在给定时间拆分文件。 假设我只保留上周的条目以避免不断增长的综合症。
所以日期为“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 循环,如果文件变得非常大,它可能会很慢。
那么,有没有关于标准命令/实用程序的更好建议?
最佳答案
您可以使用以下命令:
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
grep 所需的模式“2016-11-25”
root@ubuntu:/home# cat logfile | grep -m1 -n "2016-11-25"
4:2016-11-25T08:40:00+00:00 Blah blah
要获取上述输出的第一个值,请使用带分隔符“:”的剪切命令
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
关于用于拆分日志文件的 Linux shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40828146/