printf零填充字符串

时间:2015-01-13 11:49:47

标签: perl awk printf

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)}'

由于在即将发布的版本中这可能会破坏,我正在寻找一种更健壮但仍然紧凑的方式来格式化字符串。

3 个答案:

答案 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.最后打印换行符。