HY,
有人可以帮我分割日志文件中的mac地址吗? : - )
此:
000E0C7F6676
应该是:
00:0E:0C:7F:66:76
Atm我把它与OpenOffice分开,但有超过200个MAC地址'这非常无聊而且很慢......
如果解决方案是bash,那就太好了。 : - )
提前致谢。
答案 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