gpt4 book ai didi

linux - 将日志条目安排到标有日期的文件中

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:56 26 4
gpt4 key购买 nike

我正在尝试拆分一个大型日志文件,一次包含数月的日志条目,并且我正在尝试按日期将其拆分为多个日志文件。有几千行如下:

Sep 4 11:45 kernel: Entry
Sep 5 08:44 syslog: Entry

我正在尝试将其拆分,以便文件 logfile.20090904 和 logfile.20090905 包含条目。

我创建了一个程序来读取每一行,并将其发送到适当的文件,但它运行起来很慢(特别是因为我必须将月份名称转换为数字)。我考虑过每天执行一次 grep,这需要在文件中找到第一个日期,但这似乎也很慢。

是否有更优的解决方案?也许我缺少一个运行得更好的命令行程序。

这是我目前的解决方案:

#! /bin/bash
cat $FILE | while read line; do
dts="${line:0:6}"
dt="`date -d "$dts" +'%Y%m%d'`"
# Note that I could do some caching here of the date, assuming
# that dates are together.
echo $line >> $FILE.$dt 2> /dev/null
done

最佳答案

@OP 尽量不要使用 bash 的 while read 循环来迭代大文件。它经过尝试并证明它很慢,而且,您正在为您阅读的文件的每一行调用外部日期命令。这是一个更有效的方法,只使用 gawk

gawk 'BEGIN{
m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",mth,"|")
}
{
for(i=1;i<=m;i++){ if ( mth[i]==$1){ month = i } }
tt="2009 "month" "$2" 00 00 00"
date= strftime("%Y%m%d",mktime(tt))
print $0 > FILENAME"."date
}
' logfile

输出

$ more logfile
Sep 4 11:45 kernel: Entry
Sep 5 08:44 syslog: Entry

$ ./shell.sh

$ ls -1 logfile.*
logfile.20090904
logfile.20090905

$ more logfile.20090904
Sep 4 11:45 kernel: Entry

$ more logfile.20090905
Sep 5 08:44 syslog: Entry

关于linux - 将日志条目安排到标有日期的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com