在linux上使用perl,我试图解析来自FIFO的输入并截断每一行的部分,并替换一些剩余的字符 - 以便为命令行实用程序格式化它,将在所有的时候调用FIFO中的待定行已被修改。
我的输入可能如下所示:
[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
由此,我需要用TAB字符替换前3个分号。
我不是Perl正则表达式的专家 - 所以我不知道如何实现所需的输出。
有人能帮帮我吗?我的脚本变量替换行应该是什么样的?
我肯定知道,这不起作用,因为它取代了所有的分号:
$nsca_mystr=~s/\;/\t/g;
答案 0 :(得分:1)
animationDidStop
答案 1 :(得分:1)
perl -p -e 's/^.+?;(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;' < infile > outfile
这&#34;分裂&#34;输入线分为四个&#34;字段&#34;在前四个;
并将其替换为由\t
分隔的第二,第三和第四个字段。第一个字段被删除,剩余的文本(在第四个;
之后)保持不变。
它也可以写成
perl -p -e 's/^(.+?);(.+?);(.+?);(.+?);/$2\t$3\t$4\t/;' < infile > outfile
使意图更清晰,但这将(理论上)稍微慢一点,因为它捕获了4组而不是3组,并抛弃了第1组。
答案 2 :(得分:0)
为每一行尝试此操作:
$nsca_mystr =~ s/^(.+?);(.+?);(.+?);/$1\t$2\t$3\t/;
答案 3 :(得分:0)
这是我能想到的:
首先删除"[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