BASH: разделенный MAC-адрес -> 000E0C7F6676 до 00: 0E: 0C: 7F: 66: 76 - PullRequest
4 голосов
/ 16 июля 2010

Hy,

Может ли кто-нибудь помочь мне с выделением mac-адресов из файла журнала? : -)

Это:

000E0C7F6676

должно быть:

00:0E:0C:7F:66:76

Атм Я разделил это с OpenOffice, но с более чем 200 MAC-адресами 'это очень скучно и медленно ...

Было бы неплохо, если бы решение было в bash. : -)

Заранее спасибо.

Ответы [ 6 ]

5 голосов
/ 16 июля 2010
$ 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
5 голосов
/ 16 июля 2010

Простой скрипт sed должен это сделать.

sed -e 's/[0-9A-F]\{2\}/&:/g' -e 's/:$//' myFile

Это займет список mac адресов в myFile, по одному на строку, и вставит ':' после каждых двух шестнадцатеричных цифр, и, наконец, удалит последний.

4 голосов
/ 16 июля 2010

Чистый Баш.Этот фрагмент

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
1 голос
/ 17 июля 2010

Требуется версия Bash> = 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 внутрьцикл.

К сожалению, в Bash нет эквивалента sed 's/../&:/', использующему что-то вроде ${mac//??/??:/}.

1 голос
/ 16 июля 2010

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

1 голос
/ 16 июля 2010
$ 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
...