我正在尝试创建一些简单的通过/失败测试脚本,但我遇到了一些挑战,如下所述。我的目的是将命令(例如 ping)的完整结果放入results.txt
文件中保存,同时解析该results.txt
文件以进行不同的检查,以在检测到问题时提出:
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss = `awk '/packet loss/{x=$6} END{print x}' results.txt`
echo "$packetloss" >> debug.txt
# if packetloss > 0, add to an error.txt to fail
# if avg ping time > 5ms, add to an error.txt to fail
packetloss 变量没有得到awk
文件中的信息results.txt
(发送到调试文件以进行查看)。我想知道 shell 脚本是否有一些东西可以阻止这种情况以及相关的解决方法?
手动运行awk
返回results.txt
“0%”,这是预期结果。
答案1
周围不允许有空格=
!
所以:
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt
或者甚至更短:
ping -c 20 google.com |
awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'
笔记:
- 不需要给
x
变量赋值;你可以$6
直接打印。 - AWK 本身可以用其输出创建新文件
- 反引号
`
用于旧式命令替换,例如:
foo=`命令`
foo=$(command)
建议改用该语法。内部的反斜杠处理$()
并不令人惊讶,并且$()
更容易嵌套。
查看http://mywiki.wooledge.org/BashFAQ/082
额外的解决方案使用珀尔:
ping -c 20 google.com |
perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt
答案2
#!/usr/bin/perl
my $host=shift or die("Usage $0 host\n");
open(PING , "-|", "ping -c 20 $host") or die;
open(DEBUG, ">>", "debug.txt" ) or die;
while(<PING>){
if(m!(\d+)% packet loss! ){ $Lost=$1 }
if(m!rtt.*= (.+?)/(.+?)/(.+)!){ $Avg=$2 }
}
if ( $Lost > 0 ) { print DEBUG "not ok: lost pcks ($Lost%)\n" }
elsif( $Avg > 5 ) { print DEBUG "not ok: too slow ($Avg)\n" }
else { print DEBUG "ok: ping\n" }