2010-03-08 40 views
1

我想用一個shell在日誌文件的每一行上用''替換第一個字符'x''腳本。日誌文件示例:處理日誌以修復格式錯誤的IP地址?。?。?。x

216.129.119.x [01/Mar/2010:00:25:20 +0100] "GET /etc/.... 
74.131.77.x [01/Mar/2010:00:25:37 +0100] "GET /etc/.... 
222.168.17.x [01/Mar/2010:00:27:10 +0100] "GET /etc/.... 

我的卑微......

#!/bin/bash 
echo Starting script... 
cd /Users/me/logs/ 
gzip -d /Users/me/logs/access.log.gz 
echo Files unzipped... 
echo I'm totally lost here to process the log file and save it back to hd... 

exit 0 

爲什麼日誌文件IP畸形這樣嗎?我的網絡提供者(1and1)決定不存儲IP地址,所以他們用字符'x'替換了最後一個數字。他們告訴我這是'法律'的新要求。我個人認爲這是bs,但那會讓我們脫離主題。

我想用AWstats處理這些日誌文件,所以我需要一個不會格式錯誤的IP地址。我想用一個更換X,就像這樣:

216.129.119.7 [01/Mar/2010:00:25:20 +0100] "GET /etc/.... 
74.131.77.7 [01/Mar/2010:00:25:37 +0100] "GET /etc/.... 
222.168.17.7 [01/Mar/2010:00:27:10 +0100] "GET /etc/.... 

不完美,但我知道,但至少我可以處理的文件,我仍然會得到許多像國家有用的信息,訪客數量等等。每個日誌文件都是200MB,所以我認爲shell腳本是一條可行的路線,因爲我可以在Macbook Pro本地快速執行此操作。不幸的是,我對shell腳本知之甚少,而且我的javascript技能不會在這次減少。我感謝您的幫助。

回答

2

下面的Perl的一行應該做的伎倆:

perl -p -i -e 's/\.x/\.7/' foo.log

它會替代與日誌文件中的每一行」 0.7' 「.X」的第一個實例。

+1

你不應該逃脫點嗎? – 2010-03-09 01:15:34

+0

應該有和做過。但我需要雙倍轉義才能正確顯示在帖子中。感謝您的指針 – seejay 2010-03-09 07:07:10

+0

這工作得很好。我確實嘗試了所有的解決方案,但是這很快並且直接安裝在我的腳本中。它在25秒內完成了240MB的日誌。 – skymook 2010-03-09 13:04:22

0

你可以使用這個小python腳本(這也許可以寫更少的行比這):

import sys 
for line in sys.stdin: 
    ip_number, rest = line.split(' ', 1) 
    ip_parts = ip_number.split('.') 
    ip_parts[3] = '7' 
    ip_number = '.'.join(ip_parts) 
    print ip_number, rest, 

保存爲fixip.py,並執行它:

cat access.log | python fixip.py > output.txt 
+0

即使我使用了正確的命令「cat access」。日誌| Python的fixip.py「輸出到我的終端,而不是我需要的文件 – skymook 2010-03-09 11:46:58

+0

在Unix中,」一切都是文件「,所以你可以通過」>「指令將輸出直接重定向到一個文件中, – mojbro 2010-03-12 10:26:58

+0

感謝您的更新 – skymook 2010-03-12 13:07:55

2

,而我不不知道在每個IP中放置「7」的目的是什麼,因爲這是不準確的,不過,這裏是一個awk單線程

$ awk '{sub(/x$/,7,$1)}1' file 
216.129.119.7 [01/Mar/2010:00:25:20 +0100] "GET /etc/.... 
74.131.77.7 [01/Mar/2010:00:25:37 +0100] "GET /etc/.... 
222.168.17.7 [01/Mar/2010:00:27:10 +0100] "GET /etc/.... 
+0

把7放在每個IP末尾的目的是因爲我的ISP已經刪除了IP的最後一部分並且放置了一個x. 我認爲最互聯網服務提供商將爲他們的客戶提供256個塊,同一國家的訪問者來自同一個ISP塊範圍的可能性很小,216.129.119.7確實來自同一國家,即216.129.119.38,在美國是這樣的。 7號,這是我可以使用的任何其他號碼一樣好;) – skymook 2010-03-09 11:31:04

+0

@skymook我會選擇'255' ;-) – 2010-03-09 15:28:27

0

的Python(與文件運行作爲第一個參數來處理):

import sys 
import gzip 

fin = gzip.GzipFile(sys.argv[1], 'r') 
fout = gzip.GzipFile(sys.argv[1] + '.new', 'w', 9) 

for line in fin: 
    address, rest = line.split(' ', 1) 
    prefix, node = address.rsplit('.', 1) 
    fout.write('%s.7 %s' % (prefix, rest)) 

fin.close() 
fout.close() 
3

,因爲每個人都在發佈他們的替代解決方案我要去發佈一個,我認爲是非常簡單的:

sed s/\.x/\.7/ input_file > output_file 

用「.7」替換任何字符串「.x」

希望它有幫助! :)