2016-06-22 5 views
0

Используя perl on linux, я пытаюсь проанализировать ввод из FIFO и обрезать части каждой строки и заменить некоторые из оставшихся символов - чтобы отформатировать его для утилиты командной строки, который будет вызываться, когда все отложенные строки в FIFO были изменены.Заменить первые вхождения x на каждую строку

Мой вход может выглядеть следующим образом:

[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003 
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Connectivity - Admin sessions;0;Connection OK | 
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Uptime;0;Uptime ok - 253 days 07:53:49 | 
[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301a;Volumes in pool;0;Number of volumes: 500 is OK | numvols=500 

Первая часть строки - до первой точки с запятой должен быть удален - это даст мне:

rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003 
rs301a;Connectivity - Admin sessions;0;Connection OK | 
rs301a;Uptime;0;Uptime ok - 253 days 07:53:49 | 
rs301a;Volumes in pool;0;Number of volumes: 500 is OK | numvols=500 

От этого я необходимо заменить первые 3 точки с запятой символами TAB.

Я не эксперт в регулярных выражениях Perl - так что я понятия не имею, как достичь желаемого результата.

Может ли кто-нибудь помочь мне? Какая должна быть строка замены переменных скрипта?

Я знаю точно, что это не работает, так как он заменяет все: запятой

$nsca_mystr=~s/\;/\t/g; 

ответ

1
perl -p -e 's/^.+?;(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;' <infile> outfile 

Этот «расколов» входные линии в четырех «полей» в первых четырех ; и заменяет их с 2 , 3-го и 4-го полей, разделенных \t. Первое поле отбрасывается, а оставшийся текст (после 4-го ;) остается неизменным.

Это также может быть записана в виде

perl -p -e 's/^(.+?);(.+?);(.+?);(.+?);/$2\t$3\t$4\t/;' <infile> outfile 

сделать намерение ясным, но это будет (в теории), немного медленнее, потому что она захватывает 4 группы вместо 3 и бросает 1-ый прочь.

0

Попробуйте это для каждой строки:

$nsca_mystr =~ s/^(.+?);(.+?);(.+?);/$1\t$2\t$3\t/; 
1
while (<DATA>) { 
    my ($line) = $_ =~ /;(.*)/; # capture everything after first `;` 
    $line =~ s/;/\t/ for 1 .. 3; # substitute `;` for \t for first 3 occurrences 
    print "$line\n"; 
} 
0

Ths является то, что я могу подумайте:

Сперва удалить "[1466621350] PROCESS_SERVICE....." часть

Затем удалите первую 3 ";"

#!/usr/bin/perl 
use warnings; 
my $line = "[1466621350] PROCESS_SERVICE_CHECK_RESULT;rs301;Disk IOPS;0;No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003"; 


$line =~ s/[[\d]+]\s+PROCESS_SERVICE_CHECK_RESULT;//g; 

print "After regex : "; 
$line =~ s/(\w+);(\w+\s\w+);(\d+);(.*)/$1\t$2\t$3\t$4/g; 
print $line; 
print "\n"; 

Выход:

After regex : rs301  Disk IOPS  0  No disks exceeds defined IOPS thresholds | sda=1.40;100;200 sdb=0.00;200;400 sdc=0.00;100;200 sdd=0.00;800;900 sde=0.00;800;900 sdf=0.40;200;3003 
Смежные вопросы