BASH:拆分MAC地址 - > 000E0C7F6676至00:0E:0C:7F:66:76

时间:2010-07-16 14:13:40

标签: macos bash string split

HY,

有人可以帮我分割日志文件中的mac地址吗? : - )

此:

000E0C7F6676

应该是:

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

Atm我把它与OpenOffice分开,但有超过200个MAC地址'这非常无聊而且很慢......

如果解决方案是bash,那就太好了。 : - )

提前致谢。

7 个答案:

答案 0 :(得分:5)

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

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

这将获取myFile中的mac地址列表,每行一个,并在每两个十六进制数后插入一个':',最后删除最后一个。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:1)

需要Bash版本&gt; = 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操作。

不幸的是,使用sed 's/../&:/'之类的内容,{B}与${mac//??/??:/}之间没有相同的效果。

答案 6 :(得分:0)

a='0123456789AB'
m=${a:0:2}:${a:2:2}:${a:4:2}:${a:6:2}:${a:8:2}:${a:10:2}

结果:

01:23:45:67:89:AB