2017-08-27 1 views
0

私はスクリプト(シェル)ウィッチで、7つのフィールドを持つカスタムログファイル(500M〜2G)をタブ区切りファイルに変換してから、MONGODBにインポートします変換の時間が重要です。フォーマット(入力ファイル形式)ログ:カスタムログファイルをTSV(シェルスクリプト)に変換する

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/ 

のみのUserAgentフィールドにスペースが含まれています。

+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

関連する問題