2017-08-27 77 views
0

我工作的一個腳本(殼)女巫自定義日誌文件(500M〜2G)7場轉換爲製表符分隔的文件,然後導入到MongoDB的同時轉換時間很重要。日誌格式(輸入文件格式):轉換自定義日誌文件導入TSV(shell腳本)

date time  src_ip  dst_ip  "user" "useragent" http_url 

我試過下面AWK命令,但它需要太長時間了1GB的日誌文件(事件並聯)!還有另一種更快的方法嗎?

cat file.log | awk -vFPAT='([^ ]+)|(\"[^\"]+\")' -vOFS='[ \t]+' '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7}' > res.tsv 

更新:輸入日誌樣品(定界符:多個空間/ \ S + /):

2017-03-01 12:23:02  192.168.1.5 204.79.197.200 "admin" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0" http://www.bing.com/ 
2017-03-01 12:23:05  192.168.1.12 13.82.28.61 "user1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0" http://www.msn.com/ 
2017-03-01 12:23:05  192.168.1.12 204.79.197.200 "user1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0" http://www.bing.com/ 
2017-03-01 12:23:06  192.168.1.24 172.227.89.22 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" http://www.fifa.com/ 

輸出(製表符分隔):

2017-03-01\t12:23:02\t192.168.1.5\t204.79.197.200\t"admin"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.bing.com/ 
2017-03-01\t12:23:05\t192.168.1.12\t13.82.28.61\t"user1"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.msn.com/ 
2017-03-01\t12:23:05\t192.168.1.12\t204.79.197.200\t"user1"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.bing.com/ 
2017-03-01\t12:23:06\t192.168.1.24\t172.227.89.22\t"-"\t"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"\thttp://www.fifa.com/ 

只有用戶代理字段包含空格。

+0

能否請您給輸入格式的一個具體的例子,什麼相應的輸出會是什麼樣子? –

+0

@GregoryNisbet最終目的是要在MongoDB中導入此日誌,以便我猜我需要將它們轉換爲CSV或TSV進口。 – HBS

+0

@EdMorton這些都是投入......我想將它們轉換爲製表符分隔的文件,這樣我就可以在數據庫中導入。 – HBS

回答

2
$ awk -v s='\\t' 'BEGIN{FS=OFS="\""} {gsub(/ +/,s,$1); $3=s; gsub(/ +/,s,$5)}1' file 
2017-03-01\t12:23:02\t192.168.1.5\t204.79.197.200\t"admin"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.bing.com/ 
2017-03-01\t12:23:05\t192.168.1.12\t13.82.28.61\t"user1"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.msn.com/ 
2017-03-01\t12:23:05\t192.168.1.12\t204.79.197.200\t"user1"\t"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0"\thttp://www.bing.com/ 
2017-03-01\t12:23:06\t192.168.1.24\t172.227.89.22\t"-"\t"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"\thttp://www.fifa.com/ 

只要改變s='\\t's='\t'當你快樂與它的外觀。

+0

它爲我工作......我把它與平行命令和結果混合在一起,這很好。所以這是做轉換的最快方法嗎? – HBS