Shell 脚本无法 awk 创建的文件

Shell 脚本无法 awk 创建的文件

我正在尝试创建一些简单的通过/失败测试脚本,但我遇到了一些挑战,如下所述。我的目的是将命令(例如 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"                      }

相关内容