0

我有一个像这样的数百万行的日志

1482364800 bunch of stuff 172.169.49.138 252377 + many other things
1482364808 bunch of stuff 128.169.49.111 131177 + many other things 
1482364810 bunch of stuff 2001:db8:0:0:0:0:2:1 124322 + many other things
1482364900 bunch of stuff 128.169.49.112 849231 + many other things
1482364940 bunch of stuff 128.169.49.218 623423 + many other things

它太大了,我无法真正将它读入内存以供 python 解析,所以我只想将我需要的项目 zgrep 出到另一个较小的文件中,但我对 grep 不是很好。在 python 中,我通常会打开.gzip(log.gz) 然后将 data[0],data[4],data[5] 提取到一个新文件中,这样我的新文件只有 epoc 和 ip 以及日期(ip 可以是 ipv6 或 4)

新文件的预期结果:

1482364800 172.169.49.138 252377
1482364808 128.169.49.111 131177  
1482364810 2001:db8:0:0:0:0:2:1 124322 
1482364900 128.169.49.112 849231 
1482364940 128.169.49.218 623423 

我该怎么做这个zgrep?

谢谢

4

2 回答 2

1

要选择列,您必须使用剪切命令 zgrep/grep 选择行,以便您可以使用这样的剪切命令

剪切-d''-f1,2,4

在这个例子中,我得到第 1 2 和 4 列,其中空格 ' ' 作为列的分隔符,您应该知道 -f 选项用于指定列数,而 -d 用于分隔符。

我希望我已经回答了你的问题

于 2017-01-29T21:59:05.850 回答
0

我在 OSX 上,也许这就是问题所在,但我无法让 zgrep 过滤掉列。并且 zcat 一直在 .gz 的末尾添加一个 .Z。这就是我最终做的事情:

awk '{print $1,$3,$4}' <(gzip -dc /path/to/source/Largefile.log.gz) | gzip > /path/to/output/Smallfile.log.gz

这让我可以过滤掉从大文件到小文件所需的 3 列,同时将源和目标保持为压缩格式。

于 2017-01-31T00:29:53.233 回答