我想编辑bl:ab:la:bl:ab:la
格式为 >>的 MAC 列表blab.labl.abla
。每个 MAC 占一行。我是 AWK 或 SED 的新手,但我几乎确信可以使用其中任何命令来执行此操作。
有没有办法设置必须插入字符(点)的列位置(使用 sed 或 awk)以完成此任务?
我已经阅读了 sed 手册页,但并没有得到任何明确的解释。
答案1
和awk
:
awk -F: '{print $1$2"."$3$4"."$5$6}'
-F:
将设置:
为字段分隔符并将print $1$2"."$3$4"."$5$6
打印字段$1
,$2
然后打印.
等等...其余的是不言自明的。
例子:
$ echo "bl:ab:la:bl:ab:la" | awk -F: '{print $1$2"."$3$4"."$5$6}'
blab.labl.abla
它还可以从如下文件中读取数据:
awk -F: '{print $1$2"."$3$4"."$5$6}' file
并就地修改文件(即编辑原始文件)像这样:
gawk -i inplace -F: '{print $1$2"."$3$4"."$5$6}' file
答案2
如果你输入的是实际的 MAC 地址,那么 perl 有一个网络::MAC模块(在 Ubuntu 中可通过软件包获得libnet-mac-perl
):
前任。
$ echo '01:23:45:67:89:AB' | perl -MNet::MAC -lne '
my $m = Net::MAC->new("bit_group" => 8, "delimiter" => ":", "mac" => $_);
print $m->convert("bit_group" => 16, "delimiter", ".")
'
0123.4567.89ab
对于任意 ASCII 文本,你可以解包分隔对,然后将它们通过字符串连接在一起:
$ echo 'bl:ab:la:bl:ab:la' | perl -MList::Util=pairmap -nE '
say join ".", pairmap { $a . $b } unpack("(A2x)*",$_)
'
blab.labl.abla
答案3
操作 bash 参数
您可以通过操作 bash 参数来实现此目的,删除冒号,然后在 4 个字符的字符串之间插入点。有关详细信息,请参阅有关“参数扩展”的章节man bash
。
下面的 shellscript 文件script
可以做你想做的事情,
#!/bin/bash
function converter {
tmp0="$1"
tmp1=${tmp0//:/}
#echo "$tmp1"
tmpstr="${tmp1:0:4}.${tmp1:4:4}.${tmp1:8:4}"
echo "$tmpstr"
}
#######
# main
#######
if test -s "$1"
then
while read line
do
converter "$line"
done < "$1"
else
echo "Usage: ${0##*/} <file-with-list-of-macs>"
fi
例如:我制作了一个小的输入文件macs
ab:cd:ef:gh:ij:kl
12:ab:34:cd:56:ef
qw:er:ty:as:df:gh
并运行以下命令,
$ ./script macs
abcd.efgh.ijkl
12ab.34cd.56ef
qwer.tyas.dfgh
使用 sed 的命令行
您也可以使用sed
与上述几乎相同的方法:删除冒号,然后在 4 个字符的字符串后插入点,最后必须删除每行末尾的多余点,
$ < macs sed -e 's/\://g' -e 's/..../&./g' -e 's/\.$//'
abcd.efgh.ijkl
12ab.34cd.56ef
qwer.tyas.dfgh
对于巨大的输入文件,此解决方案的速度sed
比 bash shellscript 快得多。
< huge.in sed -e 's/\://g' -e 's/..../&./g' -e 's/\.$//' > huge.out