2013-03-08 63 views
1

在先前的問題,我問如何從依賴於正則表達式的日誌文件輸出: How to use grep to output unique lines of code from a file?使用perl從日誌文件輸出獨特的行?

現在,我使用的是現在腳本輸出列表,如:

11.12.13.14 www.mydomain.org.uk 
11.12.13.16 www.mydomain.org.uk 
105.2.3.1 www.myseconddomain.org.uk 
105.2.3.1 myseconddomain.org.uk 

我會喜歡做的就是擦除共享相同C類ip的行。所以,我想調整以前的答案輸出:

11.12.13.14 www.mydomain.org.uk 
105.2.3.1 www.myseconddomain.org.uk 

我怎樣才能做到呢?

+0

'11.12.13.16'發生了什麼事? – Madbreaks 2013-03-08 21:25:36

+0

你對perl有特別的瞭解嗎,或者你可以使用shell命令來執行sed或awk? – Tuxdude 2013-03-08 21:26:33

+1

它與11.12.13.14共享相同的C類,所以它應該被跳過 – Tom 2013-03-08 21:26:45

回答

2

這裏有一個Perl的一行應該做的伎倆:

perl -ne 'print if /^((\d+\.){3})/ and not $seen{$1}++' < logfile.txt 

的正則表達式/^((\d+\.){3}/匹配的第一個IP的三個八位字節(或者,確切地說,三個一個或多個數字序列,每個數字後跟一個碘,在行首),並在$1中捕獲它們。表達式$seen{$1}++然後遞增散列%seen中的對應元素(如果需要,創建它),並在之前返回值(因此當且僅當該值爲$1以前未見過時,這將是錯誤的)。

+0

'不匹配(在正則表達式中;用< - HERE中的m/^(< - HERE(\ d + \。){3}/at -e行1')標記 – Tom 2013-03-08 21:33:28

+0

@Tom:已經修復。 – 2013-03-08 21:34:02

0

試AWK一行代碼:

awk '!a[$1]++ && !b[$2]++' file 

測試

kent$ echo "11.12.13.14 www.mydomain.org.uk 
11.12.13.16 www.mydomain.org.uk 
105.2.3.1 www.myseconddomain.org.uk 
105.2.3.1 myseconddomain.org.uk"|awk '!a[$1]++ && !b[$2]++' 
11.12.13.14 www.mydomain.org.uk 
105.2.3.1 www.myseconddomain.org.uk 
+0

'94.134.40.100失敗mydomain.com 94.134.40.241 www.mydomain.com' – Tom 2013-03-08 21:31:30

+0

@Tom:請更新您問題中的示例數據以包含這些內容案例。祝你好運。 – shellter 2013-03-08 21:38:26

相關問題