我正在尝试与使用 NUT 管理的 UPS 进行通信。我想从中读取线电压、电池电量等值。我不想向它发送关闭命令。
起初我打算乱抓“upsc apc@remotehost”的输出并用正则表达式对其进行解析。
...然后我开动脑筋,查看了 CPAN,找到了 UPS::Nut 模块,但尝试之后才发现它是在 2002 年最后一次更新,它无法与最新版本的 NUT 一起使用。
那么有没有比解析输出更好的方法高中使用正则表达式?
答案1
在 PERL 中,如果您在一个大字符串中捕获一个命令的输出,则应该使用标志m
来仅匹配具有某些模式的行。
- 一个非常简单的例子perl
my $upsc_output=`/bin/upsc qnapups\@qnap.local 2>&1` ;
my $bat_charge=( $upsc_output =~ /^battery\.charge: (.*)$/m)[0] ;
my $ups_status=( $upsc_output =~ /^ups\.status: (.*)$/m)[0] ;
printf("BAT_CHARGE %s\n",$bat_charge) ;
printf("UPS_STATUS %s\n",$ups_status) ;
- 一个非常简单的例子狂欢
INFO_UPS=$(mktemp)
upsc [email protected] > ${INFO_UPS} 2>/dev/null
BAT_CHARGE=$( grep '^battery\.charge:' $INFO_UPS | cut -d: -f2- )
UPS_STATUS=$( grep '^ups\.status:' $INFO_UPS | cut -d: -f2- )
printf 'BAT_CHARGE %s\n' "$BAT_CHARGE"
printf 'UPS_STATUS %s\n' "$UPS_STATUS"