根据日期将大型日志文件分成几部分

根据日期将大型日志文件分成几部分

我正在尝试制定一个 Linux 命令来根据日期将一个大日志文件分割成多个部分。

使用如何按月分割现有的 apache 日志文件?作为起点,我尝试过:

awk '{ split($4,array,"/"); print > array[2] ".txt" }' TestLog.txt

在我的示例 TestLog.txt(包含不同年份的 5 月、6 月和 7 月条目)中,这创建了文本文件 May.txt、Jun.txt 和 Jul.txt:

为了理解数组中的值,我消除了输出文件,并使用以下方法显示数组值:

awk '{ split($4,array,"/"); print  array[1] "  "  array[2] "  " array[3] "  " array[4] }' TestLog.txt

TestLog.txt 的前两行是:

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
58.61.164.39 - - [31/May/2011:00:36:35 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

这导致了[30 May 2011:23:21:37 文件中的第一行。

结果让我非常困惑。尤其:

  1. 为什么array[1]等于[30而不是124.115.5.11 - - [30

  2. 为什么array[3]等于2011:23:21:37而不是2011:00:36:35 -0500] "GET

  3. 为什么为array[4]空?

  4. 的值应该array[0]是多少?

答案1

我们来看第一行:

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

以及该片段的关键部分awk

awk '{ split($4,array,"/") ...

这是发生的事情:

  • awk运行并在空格上分割行(默认字段分隔符)
  • 4th该行中的字段还根据/字符进行分割
  • 分割的结果被放入array
  • array[2]随后整行被打印到名为第四个字段的第二个子字段 ( ) 的文件中

so$4字段最初包含[30/May/2011:23:21:37,拆分后我们有

array[1]=[30
array[2]=May
array[3]=2011:23:21:37

没有array[4],因为第一个4字段不包含4第一个“子字段”,也没有 ,array[0]因为awk数组索引从 1 开始。

相关内容