编写脚本以针对连续变量自动运行

编写脚本以针对连续变量自动运行

因此,我尝试将一种格式的 mac 地址转换为另一种格式,即从XXXX:XXXX:XXXXXX:XX:XX:XX:XX:XX

我能够使用模式创建 sed 字符串,但只能针对每个 mac 地址运行它。关于如何自动执行脚本以针对连续的 mac 地址运行它,有什么建议吗?

以下是一个例子:

$ echo  5254.0040.8beb | sed  's/\.//g' |  sed -e 's/\([0-9A-Fa-f]\{2\}\)/\1:/g' -e 's/\(.*\):$/\1/'
52:54:00:40:8b:eb

我不想运行它 100 次:/

答案1

执行此操作的方法是将所有 MAC 地址保存在一个文件中,然后sed对该文件运行命令。不过,您的方法太复杂了,请尝试以下方法:

$ echo 5254.0040.8beb | sed 's/\.//g; s/../&:/g; s/:$//'
52:54:00:40:8b:eb

第一个s///命令删除.,第二个命令将每组 2 个字符 ( ..) 替换为它们自己 ( &) 和:,第三个命令删除:前一个替换命令添加到行尾的 。

要对 MAC 地址文件 (每行一个地址) 运行此操作,请执行以下操作:

sed 's/\.//g; s/../&:/g; s/:$//' file

答案2

$ echo 5254.0040.8beb | sed -r 's/\./:/g; s/([[:xdigit:]]{2})([[:xdigit:]]{2})/\1:\2/g'
52:54:00:40:8b:eb

答案3

使用 awk 的方法:为了处理单个字符,将字段分隔符定义为空白,删除原始 MAC 地址中的点,并在每隔一个字符后打印一个点。对于单个 MAC 地址,代码将如下所示:

echo 5254.0040.8beb  | awk -F '' '{gsub(/\./,"");for(i=1;i<=NF;i++){printf $i;if(i%2 == 0 && i!=NF) printf ":"   }}'

我们可以将代码转换成可执行脚本,如下所示:

  1. 创建一个名为的文件mac-editor.awk。其内容位于以下文件中
  2. 使用以下方式使脚本可执行chmod 755 mac-editor.awk
  3. 使用输入文件作为参数运行代码,如下所示

    ./mac-editor.awk 输入文件.txt

AWK 脚本内容

#!/usr/bin/awk -f
BEGIN {
FS="";
}

{
 gsub(/\./,"");
 for(i=1;i<=NF;i++){
   printf $i;
   if(i%2 == 0 && i!=NF) 
      printf ":"   
 };
 printf "\n";
}

演示

下面的演示显示了脚本如何处理输入文件,其中有 MAC 地址列表,每行一个。

$ cat mac-addresses.txt                                                        
7ab1.34b9.2eb0
2689.373c.d131
d271.a9a2.14c4

$ mac-editor.awk mac-addresses.txt                                             
7a:b1:34:b9:2e:b0
26:89:37:3c:d1:31
d2:71:a9:a2:14:c4

相关内容