我正在尝试制定一个 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
文件中的第一行。
结果让我非常困惑。尤其:
为什么
array[1]
等于[30
而不是124.115.5.11 - - [30
?为什么
array[3]
等于2011:23:21:37
而不是2011:00:36:35 -0500] "GET
?为什么为
array[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
运行并在空格上分割行(默认字段分隔符)4
th该行中的字段还根据/
字符进行分割- 分割的结果被放入
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 开始。