2012-04-24 54 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}('一至五位数')。

如果您非常注重细节,甚至可以更精确地限制数字范围,但这可能不值得。这是正则表达式处理的一个常见特性;你可以为手头的工作提供足够好的东西,而不必处理恶意可能引发的任何变化。你必须对做什么做出判断。