Perl如何解析CSV并将节点名填入system命令对应位置批量执行
解决方案
结论
可以实现,现有代码仅完成了CSV文件读取逻辑,补充遍历解析节点名、动态构造命令参数的逻辑即可达到需求。
修改步骤
- 遍历读取到的CSV每行数据,先去除每行末尾的换行符,若CSV包含表头可跳过首行
- 用Perl字符串插值将节点名动态替换到
node=的参数位置 - 逐行调用system执行构造好的命令即可
最简修改后代码(适用于CSV每行仅存一个节点名的场景)
#!/usr/bin/perl use strict; use warnings; use POSIX qw(strftime); # 批量将节点设为未激活状态 my $inputfile = "/home/nmis/InactiveNodes.csv"; open(INPUT,'<',$inputfile) or die $!; my @data = <INPUT>; close INPUT; # 读完文件及时关闭句柄 foreach my $line (@data) { chomp $line; # 去掉行尾换行符 next if $line =~ /^\s*$/; # 跳过空行 # 若CSV包含表头,可添加下面这句跳过首行:next if $. == 1; # 动态构造执行命令 my $cmd = "/usr/local/nmis9/admin/node_admin.pl act=set node=$line entry.activated.NMIS=0 entry.activated.opConfig=0 entry.activated.opEvents=0 &"; system($cmd); }
注意事项
- 如果你的CSV为多列格式,建议使用
Text::CSV模块解析节点名,避免手动拆分出现异常,示例逻辑如下:# 加载模块前需先安装:cpanm Text::CSV use Text::CSV; my $csv = Text::CSV->new({ binary => 1, auto_diag => 1 }); open my $fh, "<", $inputfile or die $!; # 假设第一列是节点名 while (my $row = $csv->getline($fh)) { my $nodename = $row->[0]; # 后续执行system逻辑同上 } close $fh; - 若不需要后台异步执行命令,可去掉命令末尾的
&符,等待单节点命令执行完成后再处理下一个节点。 - 若节点名包含空格、特殊符号,建议使用列表形式的system调用规避shell注入风险,写法示例:
system('/usr/local/nmis9/admin/node_admin.pl', 'act=set', "node=$line", 'entry.activated.NMIS=0', 'entry.activated.opConfig=0', 'entry.activated.opEvents=0', '&' );
内容的提问来源于stack exchange,提问作者Calarian
相关产品推荐
相关产品推荐

