MAC地址的格式因平台而异 例如。在HPUX上我可以得到类似的东西:
0:0:c:7:ac:1e
虽然Linux给了我
00:00:0c:07:ac:1e
我曾经在CentOS5的kornshell脚本中使用awk将其格式化为00000c07ac1e
,如下所示。
MAC="0:0:c:7:ac:1e"
echo $MAC | awk -F: '{printf( "%02s%02s%02s%02s%02s%02s\n", $1,$2,$3,$4,$5,$6)}'
不幸的是我们的管理服务器现在是Ubuntu 14LTS,带有更新版本的awk,不再支持%s
格式的零填充,我得到了一个不受欢迎的0 0 c 7ac1e
所以我现在切换到perl并执行:
echo $MAC | perl -ne '{@A=split(":"); printf( "%02s%02s%02s%02s%02s%02s", @A)}'
由于在即将发布的版本中这可能会破坏,我正在寻找一种更健壮但仍然紧凑的方式来格式化字符串。
答案 0 :(得分:2)
您的Perl代码段在将来的版本中不会中断。这是基本功能。改变它将打破许多程序。 (另外,Perl有一种机制可以在不破坏现有程序的情况下引入向后不兼容的更改。)
清理:
echo "$MAC" | perl -ne'@F=split(/:/); printf("%02s%02s%02s%02s%02s%02s\n", @F)'
更短的:
echo "$MAC" | perl -ne'printf "%02s%02s%02s%02s%02s%02s\n", split /:/'
没有重复:
echo "$MAC" | perl -ple'$_ = join ":", map sprintf("%02s", $_), split /:/'
如果你想要更多-a
ish:
awk
echo "$MAC" | perl -F: -aple'$_ = join ":", map sprintf("%02s", $_), @F'
答案 1 :(得分:0)
如果您使用的是数字而不是十六进制,则可以使用%.Xd
表示您至少需要X
位数。
$ awk -F: '{printf( "%.2d%.2d\n", $1, $2)}' <<< "0:23"
0023
^^
two digits
来自GNU Awk User’s Guide #5.5.3 Modifiers for printf Formats:
.prec
一个句点后跟一个整数常量指定精度 打印时使用。精度的含义因控制而异 信:
%d,%i,%o,%u,%x,%X
要打印的最小位数。
在这种情况下,您需要一种更通用的方法来处理MAC地址的每个块。您可以遍历元素并添加0
,以防它们的长度只有1
:
awk -F: '{for (i=1;i<=NF;i++) #loop through the elements
{
if (length($i)==1) #if length is 1
printf("0") #add a 0
printf ("%s", $i) #print the rest
}
print "" #print a new line at the end
}' <<< "0:0:c:7:ac:1e"
返回:
00000c07ac1e
^^ ^^ ^^
^^ ^^ ^^
注意awk '...' <<< "$MAC"
与echo "$MAC" | awk '...'
相同。
答案 2 :(得分:0)
有点长,但应该非常强大
awk -F: '{for(i=1;i<=NF;i++){while(length($i)<2)$i=0$i;printf "%s",$i;}print ""}'
1.浏览字段
2.当字段长度小于2个字符时,在前面添加零
3.打印字段
4.最后打印换行符。