2010-07-16 78 views
4

海兰,BASH:斯普利特MAC地址 - > 000E0C7F6676为00:0E:0C:7F:66:76

有人可以帮助我以极快的MAC地址从一个日志文件? :-)

此:

000E0C7F6676 

应该是:

00:0E:0C:7F:66:76 

大气压我分裂这个与OpenOffice的,但有超过200 MAC地址,这是很无聊的,慢...

这将是很好,如果解决方案是bash。 :-)

在此先感谢。

+1

它只是一个mac地址列表,或者是否有其他文件? – falstro 2010-07-16 14:16:39

+0

请参阅http://stackoverflow.com/questions/1187078/how-to-insert-a-new-line-character-after-a-fixed-number-of-characters-in-a-file – tanascius 2010-07-16 14:19:07

+0

还有一些其他数据在文件中。它现在适用于一些“解决方法”和你的代码片段。谢谢你们。 :-) – fwaechter 2010-07-19 06:22:49

回答

5

一个简单的sed脚本应该这样做。

sed -e 's/[0-9A-F]\{2\}/&:/g' -e 's/:$//' myFile 

这会带MAC地址列表中myFile,每行一个,并插入一个“:”每两个十六进制数字后,最后删除最后一个。

+0

谢谢你,会试试这个。 :-) – fwaechter 2010-07-16 14:23:59

+0

@Peter;请注意,这是一个相当大脑受损的方式,只会在这种情况下工作。它只比'sed -e's /../&:/ g'-e's /:$ //'myFile'好些,这实际上可能会更好,因为它更简单。 – falstro 2010-07-16 14:30:20

+0

是的,我看到了。但它的工作原理和这个片段将在一年内被使用10次左右。所以没关系。在这种情况下不需要完美的解决方案。感谢您的回答和您的评论。 :-) – fwaechter 2010-07-19 06:24:54

5
$ mac=000E0C7F6676 
$ s=${mac:0:2} 
$ for((i=1;i<${#mac};i+=2)); do s=$s:${mac:$i:2}; done 
$ echo $s 
00:00:E0:C7:F6:67:6 
+0

你知道一种实现这种工作的方法: '$ {mac // ??/??:/}',也就是说,你知道如何得到替代部分中展开的任何东西吗? – falstro 2010-07-16 14:26:11

+0

+1在$(cat file-with-macs.txt)的'for mac中包装这个;做{...}'这对OP来说是一个很好的纯粹的bash解决方案。 – 2010-07-16 17:02:25

+0

@Dan:不,它应该是'while read -r line;做...;完成 2010-07-16 20:38:27

4

Pure Bash。这个片断

mac='000E0C7F6676' 

array=() 
for ((CNTR=0; CNTR<${#mac}; CNTR+=2)); do 
    array+=(${mac:CNTR:2}) 
done 
IFS=':' 
string="${array[*]}" 
echo -e "$string" 

打印

00:0E:0C:7F:66:76 
1
$ perl -lne 'print join ":", $1 =~ /(..)/g while /\b([\da-f]{12})\b/ig' file.log 
00:0E:0C:7F:66:76

如果你喜欢它保存为一个程序,使用

#! /usr/bin/perl -ln  
print join ":" => $1 =~ /(..)/g 
    while /\b([\da-f]{12})\b/ig; 

采样运行:

$ ./macs file.log 
00:0E:0C:7F:66:76
1

imo,正则表达式是固定宽度字符串的错误工具。

perl -alne 'print join(":",unpack("A2A2A2A2A2A2",$_))' filename

另外,
gawk -v FIELDWIDTHS='2 2 2 2 2 2' -v OFS=':' '{$1=$1;print }'

这与分配有点时髦的更改打印的行为。可能更清楚,只是打印$ 1,$ 2,$ 3,$ 4 $ 5,$ 6

+0

打我吧...知道gawk必须有ananswer :-) – 2010-07-16 18:21:08

1

需要的Bash版本> = 3.2

#!/bin/bash 
for i in {1..6} 
do 
    pattern+='([[:xdigit:]]{2})' 
done 

saveIFS=$IFS 
IFS=':' 
while read -r line 
do 
    [[ $line =~ $pattern ]] 
    mac="${BASH_REMATCH[*]:1}" 
    echo "$mac" 
done <macfile.txt> newfile.txt 
IFS=$saveIFS 

如果你的文件中包含的其他信息除了MAC地址,你要保留,您需要修改正则表达式,并可能在循环内移动IFS操作。

不幸的是,使用类似${mac//??/??:/}的东西在Bash中没有相应的sed 's/../&:/'

+0

谢谢,这太糟糕了(我的意思是'$ {mac/??/??:/}'部分)。 – falstro 2010-07-19 06:44:25