如何使用grep解析csv中的列

时间:2017-01-29 21:40:20

标签: python-2.7 parsing grep zgrep

我有一个包含数百万行的日志

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),然后将数据[0],数据[4],数据[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?

由于

2 个答案:

答案 0 :(得分:1)

要选择列,必须使用cut命令zgrep / grep选择行 所以你可以像这样使用剪切命令

cut -d' ' -f1,2,4

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

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

答案 1 :(得分: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列从Largefile过滤到Smallfile,同时保持源和目标的压缩格式。