Построчное сравнение двух файлов (perl, bash)

Модератор: Модераторы разделов

victor_g
Сообщения: 5

Построчное сравнение двух файлов

Сообщение victor_g »

Добрый день!
Мне необходимо сравнить два файла. Один содержит mac адрес и порт циски, второй содержит mac и ip машины.
Мне нужно определить на каком порту циски какая машина висит, т.е. из двух файлов вида mac - порт и mac - ip сделать файл вида: порт, mac, ip.
Подскажите как это сделать...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21504
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Построчное сравнение двух файлов

Сообщение Bizdelnick »

Как-то так:

Код: Выделить всё

#!/usr/bin/perl

open(PORTS, $ARGV[0]);
while (<PORTS>) {
        ($mac, $port) = split /\s+/;
        $ports{$mac} = $port;
}
close(PORTS);

open(IPS, $ARGV[1]);
while (<IPS>) {
        ($mac, $ip) = split /\s+/;
        $ips{$mac} = $ip;
}
close(IPS);

foreach (sort keys %ports) {
        print "$ports{$_} $_ $ips{$_}\n";
}
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Построчное сравнение двух файлов

Сообщение SLEDopit »

Если это не часть какой-то задачи, то можно обойтись и без perl'a:

Код: Выделить всё

join <(sort mac-ip.txt) <(sort mac-port.txt)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
victor_g
Сообщения: 5

Re: Построчное сравнение двух файлов

Сообщение victor_g »

Bizdelnick писал(а):
08.02.2013 13:15
Как-то так:

Код: Выделить всё

#!/usr/bin/perl

open(PORTS, $ARGV[0]);
while (<PORTS>) {
        ($mac, $port) = split /\s+/;
        $ports{$mac} = $port;
}
close(PORTS);

open(IPS, $ARGV[1]);
while (<IPS>) {
        ($mac, $ip) = split /\s+/;
        $ips{$mac} = $ip;
}
close(IPS);

foreach (sort keys %ports) {
        print "$ports{$_} $_ $ips{$_}\n";
}


Substitution replacement not terminated at ./sort_perl line 13
(($mac, $port) = split /\s+/;)
Просто я не силен в программировании, а сделать как-то нужно.


SLEDopit писал(а):
08.02.2013 14:10
Если это не часть какой-то задачи, то можно обойтись и без perl'a:

Код: Выделить всё

join <(sort mac-ip.txt) <(sort mac-port.txt)

А в этом случае: join 1 is not sorted arder
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Построчное сравнение двух файлов

Сообщение SLEDopit »

victor_g писал(а):
08.02.2013 16:23
А в этом случае: join 1 is not sorted arder
Можно увидеть именно скопированные команду, которую вы вводили, скопированную ошибку и по пяток строчек из каждого файла (вместе с именами)?
Именно скопированную, а не перепечатанную.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
victor_g
Сообщения: 5

Re: Построчное сравнение двух файлов

Сообщение victor_g »

SLEDopit писал(а):
08.02.2013 16:29
victor_g писал(а):
08.02.2013 16:23
А в этом случае: join 1 is not sorted arder
Можно увидеть именно скопированные команду, которую вы вводили, скопированную ошибку и по пяток строчек из каждого файла (вместе с именами)?
Именно скопированную, а не перепечатанную.


[root@Fed-new f_s]# join -i <(sort 0) <(sort 1)
join: file 1 is not in sorted order

Файл с mac и портом

0001.807d.7007 Fa0/20
0001.807d.708f Fa0/14
0002.4426.e35c Fa0/20
000b.6a50.6511 Fa0/20
000d.8778.4f16 Fa0/20
0013.8f2f.c2cd Fa0/20
0013.a9f7.33d4 Fa0/20
0019.2119.32be Fa0/20

Файл с ip и mac

10.27.1.1 7081.051a.bbbf
10.27.1.2 2c3f.380e.4441
10.27.1.3 0022.1546.481c
10.27.1.52 0019.6660.741a
10.27.1.103 0001.807d.7007
10.27.1.189 00a8.59c4.0318
I10.27.1.235 001e.90f9.1476
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Построчное сравнение двух файлов

Сообщение SLEDopit »

А, ну конечно работать не будет. Вы в первом сообщении указали формат файлов mac-port и mac-ip (порядок для join'а важен).
Если порядок идёт mac-port и ip-mac об этом всенепременно необходимо сообщить join'y (и sort'y):

Код: Выделить всё

join -i -1 1 -2 2 <(sort mac-port) <(sort -k2 ip-mac)


зы. ай-яй-яй, под рутом работаете (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
victor_g
Сообщения: 5

Re: Построчное сравнение двух файлов

Сообщение victor_g »

SLEDopit писал(а):
08.02.2013 17:36
А, ну конечно работать не будет. Вы в первом сообщении указали формат файлов mac-port и mac-ip (порядок для join'а важен).
Если порядок идёт mac-port и ip-mac об этом всенепременно необходимо сообщить join'y (и sort'y):

Код: Выделить всё

join -i -1 1 -2 2 <(sort mac-port) <(sort -k2 ip-mac)


зы. ай-яй-яй, под рутом работаете (:


Он вообще ничего не выдает на это.

Это не сервер, на ноуте в виртуалке с файрволом эксперементировал.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Построчное сравнение двух файлов

Сообщение SLEDopit »

victor_g писал(а):
08.02.2013 18:17
Он вообще ничего не выдает на это.
На вышеприведённых огрызках файлов оно выдаёт

Код: Выделить всё

 $ join -i -1 1 -2 2 <(sort maс-port) <(sort -k2 ip-mac)
0001.807d.7007 Fa0/20 10.27.1.103
вы точно так же запускаете?
(номера после -1 и -2 - это номера одинаковых столбцов, по которым происходит склеивание)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21504
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Построчное сравнение двух файлов

Сообщение Bizdelnick »

victor_g писал(а):
08.02.2013 16:23
Substitution replacement not terminated at ./sort_perl line 13
(($mac, $port) = split /\s+/;)

Ну так покажите весь свой скрипт. Судя по тому, что в оригинале это была 5 строка, Вы туда ещё что-то добавили.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
victor_g
Сообщения: 5

Re: Построчное сравнение двух файлов

Сообщение victor_g »

Bizdelnick писал(а):
08.02.2013 23:48
victor_g писал(а):
08.02.2013 16:23
Substitution replacement not terminated at ./sort_perl line 13
(($mac, $port) = split /\s+/;)

Ну так покажите весь свой скрипт. Судя по тому, что в оригинале это была 5 строка, Вы туда ещё что-то добавили.


#!/usr/bin/perl
#
#
open(PORTS, $ARGV[0]);
while (<PORTS>) {
($mac, $port) = splin /\s+/;
$ports{$mac} = $ports;
}
сlose(PORTS);
#
open (IPS, $ARGV[1]);
while (<IPS>) {
($mac, $ip) = split /\s+/;
$ips{$mac} = $ip;
}
close(IPS);
#
foreach (sort keys %ports) {
print "$ports{$_} $_ $ips{$_}\n";
}

Я ошибся, не ту строку скопировал Вам. 13 строка у меня ($mac, $ip) = split /\s+/;. На нее ошибка.


SLEDopit писал(а):
08.02.2013 18:28
victor_g писал(а):
08.02.2013 18:17
Он вообще ничего не выдает на это.
На вышеприведённых огрызках файлов оно выдаёт

Код: Выделить всё

 $ join -i -1 1 -2 2 <(sort maс-port) <(sort -k2 ip-mac)
0001.807d.7007 Fa0/20 10.27.1.103
вы точно так же запускаете?
(номера после -1 и -2 - это номера одинаковых столбцов, по которым происходит склеивание)

У меня ничего. Я уже и файлы создал новые (в оригинальных пробелов много). :(
Запускаю также.
Но, спасибо за помощь! Может в системе косяк где. Попробую на другой машине.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21504
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Построчное сравнение двух файлов

Сообщение Bizdelnick »

victor_g писал(а):
09.02.2013 19:14
($mac, $port) = splin /\s+/;

должно быть split
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: