LINUX.ORG.RU
ФорумAdmin

проблема с перловым скриптом


0

1

день добрый! имеется странная проблема с небольшим перловым скриптом, крайне надеюсь на помощь..

итак, есть достаточно объемный грепнутый вывод с цисок следующего вида

$ cat data
AGG22;sh inve
AGG22;NAME: "CISCO7606-S", DESCR: "Cisco Systems Cisco 7600 6-slot Chassis System"
AGG22;CISCO7606-S;SN FOX
AGG22;
AGG22;NAME: "CLK-7600 1", DESCR: "OSR-7600 Clock FRU 1"
AGG22;CLK-7600;SN NWG
AGG22;
AGG22;NAME: "CLK-7600 2", DESCR: "OSR-7600 Clock FRU 2"
AGG22;CLK-7600;SN NWG
AGG22;

кат скрипта:

$ cat translate.pl 
#!/usr/bin/perl 
use strict;
use warnings;

my $crap;
my $descr;
my $result;

while ( my $line = <STDIN> ) 
{ 
chomp ($line);
if ( $line =~ /;\n/ )
{next;}
if ( $line =~ / inve/ )
{next;}
chomp ($line);

print "new iteration\n";
print "$line\n";
if ( $line =~ /.*DESCR.*/)
    {
    print "descr line found!\n";
    ($crap, $descr) = split (/DESCR: /, $line);
    print "$descr\n";
    next;
    }
if ($line =~ /.*SN.*/){
print "SN line found!!!!\n";
print "$line"."$descr"."\n";
}
}

и получаемый вывод:

$ perl translate.pl < data
"Cisco Systems Cisco 7600 6-slot Chassis System"
"OSR-7600 Clock FRU 1"LK-7600;SN NWG
"OSR-7600 Clock FRU 2"LK-7600;SN NWG
предполагается, что скрипт должен взять содержимое строки n-1 после ключевого слова «DESCR: » и вписать его в конец строки n .. но блин, такое ощущение, что содержимое записывается с начала строки, хотя стоит оператор ".".. да и без него тоже самое..

вывод с дебаговыми принтами:

$ perl translate.pl < data

new iteration
AGG22;NAME: "CISCO7606-S", DESCR: "Cisco Systems Cisco 7600 6-slot Chassis System"
descr line found!
"Cisco Systems Cisco 7600 6-slot Chassis System"
new iteration
AGG22;CISCO7606-S;SN FOX
SN line found!!!!
"Cisco Systems Cisco 7600 6-slot Chassis System"
new iteration
AGG22;
new iteration
AGG22;NAME: "CLK-7600 1", DESCR: "OSR-7600 Clock FRU 1"
descr line found!
"OSR-7600 Clock FRU 1"
new iteration
AGG22;CLK-7600;SN NWG
SN line found!!!!
"OSR-7600 Clock FRU 1"LK-7600;SN NWG
new iteration
AGG22;
new iteration
AGG22;NAME: "CLK-7600 2", DESCR: "OSR-7600 Clock FRU 2"
descr line found!
"OSR-7600 Clock FRU 2"
new iteration
AGG22;CLK-7600;SN NWG
SN line found!!!!
"OSR-7600 Clock FRU 2"LK-7600;SN NWG
new iteration
AGG22;

центос крутится под виртуалкой, думаю, не в этом ли проблема... спасибо заранее, очень надеюсь на помощь..



Последнее исправление: dvalin (всего исправлений: 1)

центос крутится под виртуалкой, думаю, не в этом ли проблема

точно не в этом

#!/usr/bin/perl 
use strict;
use warnings;

my $descr;
my $text = <<'TEND';
AGG22;sh inve
AGG22;NAME: "CISCO7606-S", DESCR: "Cisco Systems Cisco 7600 6-slot Chassis System"
AGG22;CISCO7606-S;SN FOX1208GH0J
AGG22;
AGG22;NAME: "CLK-7600 1", DESCR: "OSR-7600 Clock FRU 1"
AGG22;CLK-7600;SN NWG120102L4
AGG22;
AGG22;NAME: "CLK-7600 2", DESCR: "OSR-7600 Clock FRU 2"
AGG22;CLK-7600;SN NWG120102L4
AGG22;
TEND

foreach (split /\n/, $text) 
{	
	chomp; 
	if ( /DESCR/ )
	{
		s/^.*DESCR: //;
		$descr = $_;
	}
	elsif ( /SN/ )
	{
		print "$_ $descr\n";
		$descr = '';
	}
}

проверил в codepad, работает

marvin_yorke ★★★
()
Ответ на: комментарий от dvalin

> не являюсь адептом авка
Обязательно найдите время и внимательно почитайте man awk, а потом попробуйте распарсить им несколько текстов. Часто он позволяет писать более короткие однострочники, если дело не касается сложных алгоритмов.

> а как бы проблему перлом решить?

perl -ne 'chomp; $dsc = $1 if /DESCR:(.*)/; s/^[^;]*;// and print $_.$dsc."\n" if /SN/'

AITap ★★★★★
()
Ответ на: комментарий от marvin_yorke

блин, да что ж такое...

 
$perl translate2.pl < data
 "Cisco Systems Cisco 7600 6-slot Chassis System"
 "OSR-7600 Clock FRU 1"K-7600;SN NWG120102L4
 "OSR-7600 Clock FRU 2"K-7600;SN NWG120102L4
$ cat translate2.pl 
#!/usr/bin/perl 
use strict;
use warnings;
my $descr;
while (<>)
{	
	chomp; 
	if ( /DESCR/ )
	{
		s/^.*DESCR: //;
		$descr = $_;
	}
	elsif ( /SN/ )
	{
		print "$_ $descr\n";
		$descr = '';
	}
}

такое ощущение, что проблема именно в области принта.. хотя если взять из кодпада полностью - работает отлично..

dvalin
() автор топика
Ответ на: комментарий от dvalin

и так тоже самое...

$ perl translate2.pl 
 "Cisco Systems Cisco 7600 6-slot Chassis System"
 "OSR-7600 Clock FRU 1"K-7600;SN NWG120102L4
 "OSR-7600 Clock FRU 2"K-7600;SN NWG120102L4
$ cat translate2.pl 
#!/usr/bin/perl 
use strict;
use warnings;
my $descr;
my $data;
open INPUT, "data";
undef $/;
$data = <INPUT>;

foreach (split /\n/, $data) 
{	
	chomp; 
	if ( /DESCR/ )
	{
		s/^.*DESCR: //;
		$descr = $_;
	}
	elsif ( /SN/ )
	{
		print "$_ $descr\n";
		$descr = '';
	}

}
close INPUT;

dvalin
() автор топика
Ответ на: комментарий от marvin_yorke

так точно :( кильнул файл, скопировал в блокнот и потом через ви сделал новый файл:

$ perl translate2.pl < data
45-KURGAN-AGG22-PE-1;CISCO7606-S;SN FOX1208GH0J "Cisco Systems Cisco 7600 6-slot Chassis System"
45-KURGAN-AGG22-PE-1;CLK-7600;SN NWG120102L4 "OSR-7600 Clock FRU 1"
45-KURGAN-AGG22-PE-1;CLK-7600;SN NWG120102L4 "OSR-7600 Clock FRU 2"
все как положено... как убрать непечатные символы? :)

dvalin
() автор топика
Ответ на: комментарий от dvalin

всем спасибо, разобрался!

chomp прибил \n, но, поскольку начальные файлы были собраны виндами, в конце строк присутствовал также \r, из-за наличия которого я и получал запись второй переменной поверх первой :)

так что и мой скрипт был правильным, хотя, конечно, надо стремиться к более красивому коду :)

dvalin
() автор топика
Ответ на: комментарий от dvalin

>> поскольку начальные файлы были собраны виндами, в конце строк присутствовал также \r
во, так и думал. можно chomp заменить на регулярку, можно прогонять сначала через tr -d '\r'

marvin_yorke ★★★
()

Эх, молодёжь...

#!/usr/bin/perl 
use strict;
use warnings;

my $descr = '';
while (<STDIN>) { 
    chomp;
    next if /(;|inve)$/;

    print "new iteration\n";
    print "$_\n";

    if (/DESCR:\s*(.+)$/) {
        $descr = $1;
        print "descr line found!\n";
        print "$descr\n";
    }
    if (/SN/) {
        print "SN line found!!!!\n";
        print "$_$descr\n";
    }
}

r2d2
()
Ответ на: комментарий от r2d2
# ./2.pl < data 
new iteration
AGG22;NAME: "CISCO7606-S", DESCR: "Cisco Systems Cisco 7600 6-slot Chassis System"
descr line found!
"Cisco Systems Cisco 7600 6-slot Chassis System"
new iteration
AGG22;CISCO7606-S;SN FOX
SN line found!!!!
AGG22;CISCO7606-S;SN FOX"Cisco Systems Cisco 7600 6-slot Chassis System"
new iteration
AGG22;NAME: "CLK-7600 1", DESCR: "OSR-7600 Clock FRU 1"
descr line found!
"OSR-7600 Clock FRU 1"
new iteration
AGG22;CLK-7600;SN NWG
SN line found!!!!
AGG22;CLK-7600;SN NWG"OSR-7600 Clock FRU 1"
new iteration
AGG22;NAME: "CLK-7600 2", DESCR: "OSR-7600 Clock FRU 2"
descr line found!
"OSR-7600 Clock FRU 2"
new iteration
AGG22;CLK-7600;SN NWG
SN line found!!!!
AGG22;CLK-7600;SN NWG"OSR-7600 Clock FRU 2"
r2d2
()
Ответ на: комментарий от r2d2

Ты раньше на лоре не был зареган? Аватарка с кастрюлей?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.