2012-04-24 56 views
0

可以說我有很多IP號碼(每個用空格隔開2個線IP號碼)到(這裏是兩行)看:在UNIX上使用剪切命令來獲得最後期限

67.21.89.48.1623 139.91.131.115.110 
211.47.82.64 139.91.134.123.445 

其中一個可能沒有端口,所以週期數永遠不一致。我只需要第一個(不帶端口)的ip號碼,而只需要第二個端口(不帶ip號碼)。因此,它應該是這個樣子:

67.21.89.48 110 
211.47.82.64 445 

或者,它可能是這樣的:

67.21.89.48.110 
211.47.82.64.445 

這並不重要,只要我知道的IP和端口的位置。

我一直在使用這樣的事情:

cut -d'.' -f1-4,9 < file.txt 

但是,只有時間一致量的工作。任何方式從後面切而不是?

+3

不符合標準,沒有。我想,你需要用不同的工具來完成這項工作。你的選擇是軍團,包括'sed','awk','perl','python',可能還有更多。 – 2012-04-24 21:39:32

+0

第二個地址是否保證有端口號? – zwol 2012-04-24 22:07:27

+0

您是否可以控制IP地址/端口號的格式?在IP地址和端口號之間插入一個冒號(而不是使用句點分隔地址和端口)將更容易解析。 – 2012-04-24 22:53:41

回答

2

正如Jonathan在評論中指出的那樣,使用cut會非常複雜,因爲您需要的列數可能不同。

下面是sed一個例子:

$ echo "67.21.89.48.1623 139.91.131.115.110 
211.47.82.64 139.91.134.123.445" | sed -r 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(.*)\.([0-9]{1,4})$/\1 \4/' 
67.21.89.48 110 
211.47.82.64 445 

您可以運行它:

sed -r 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(.*)\.([0-9]{1,4})$/\1 \4/' logfile.txt 

[0-9]{1,3}\.){3}[0-9]{1,3}可能是一個IP地址,一個跛腳的正則表達式,但它是第一個,我能想到的的。你可以用更聰明的東西來代替它。 也許你甚至不需要檢查點之間的內容,只需在第四個時間段之前和最後一個之後進行。

3

詳細格式:

perl -n -e 'print "$1 $2\n" if m/^ 
           ((?:\d+\.){3}\d+)  # IPv4 address 
           (?:\.\d+)?    # Optional port 
           \s+     # White space 
           (?:(?:\d+\.){4})  # IPv4 address plus dot 
           (\d+)     # Port number 
           \s*$     # Optional white space 
           /x' perl.data 

一行代碼:

perl -ne 'print "$1 $2\n" if m/^((?:\d+\.){3}\d+)(?:\.\d+)? (?:(?:\d+\.){4})(\d+)\s*$/' 

僅打印任何東西,如果第二項有一個端口號;如果沒有,則跳過該行。

的IP地址和端口號識別可以進行對稱的,如果你喜歡(即使第二個IP地址將不被打印):

perl -n -e 'print "$1 $4\n" if m/^ \s*     # Optional white space 
           ((?:\d+\.){3}\d+)  # IPv4 address 
           (?:\.(\d+)) ?   # Optional Port number 
           \s+     # White space 
           ((?:\d+\.){3}\d+)  # IPv4 address 
           (?:\.(\d+))   # Mandatory Port number 
           \s* $     # Optional white space 
           /x' perl.data 

我用\d+爲「一個或多個數字「;對於IPv4點分十進制地址組件,可將其製作爲\d{1,3}'1至3位數',端口號可爲\d{1,5}('一至五位數')。

如果您非常注重細節,甚至可以更精確地限制數字範圍,但這可能不值得。這是正則表達式處理的一個常見特性;你可以爲手頭的工作提供足夠好的東西,而不必處理惡意可能引發的任何變化。你必須對做什麼做出判斷。