2017-01-29 32 views
0

我有幾百萬,像這樣如何使用grep來解析出列CSV

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 

它這麼大,我真的不能讀入內存行的日誌蟒蛇解析,所以我只想將我需要的項目放到另一個較小的文件中,但是我對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?

感謝

回答

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同時保持源和壓縮格式目標位置。

1

要選擇列,你必須使用剪切命令zgrep/grep的選擇線 所以你可以使用剪切命令這樣

切-d'-f1,2,4

在這個例子中,我得到的列1 2和4的空格''作爲列 的分隔符您應該知道-f選項用於指定列的數量和-d作爲分隔符。

我希望我已經回答了你的問題

+0

您好我一直在嘗試運行它,但它似乎掛着也許是我的語法:'zgrep logFile.gz |切-d''-f1,3,4> file.txt'我做錯了什麼嗎? – chowpay

+0

我認爲zgrep應該有另外一個參數,以便你想要的所以不要使用,如果你不想過濾throw line。 「」「」「這應該工作:zcat logFile.gz | cut -d''-f1,3,4」「」「」 zcat工作像貓,但它的gz文件> file.txt –

+0

這是命令我跑了:'zcat logFile.gz | cut -d''-f1,3,4 >> file.txt' 我剛剛得到這個錯誤'不能stat:logFile.gz(logFile.gz.Z):沒有這樣的文件或目錄' – chowpay