Shell 脚本无法 awk 创建的文件

dha*_*ord 7 bash

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

packetloss 变量没有awkresults.txt文件中获取信息(发送到调试文件进行查看)。我想知道是否有关于 shell 脚本的东西可以防止这种情况以及相关的解决方法?

手动运行awkresults.txt返回“0%”,这是预期的结果。

Gil*_*not 11

周围不允许有空格=

所以:

#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt
Run Code Online (Sandbox Code Playgroud)

或者更短:

ping -c 20 google.com |
    awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 无需分配x变量;可以$6直接打印。
  • AWK 本身可以用它的输出创建新文件
  • 反引号
    `
    用于旧式命令替换,例如:
foo=`命令`

foo=$(command)建议改为使用语法。内部反斜杠处理$()不那么令人惊讶,并且$()更容易嵌套。

检查http://mywiki.wooledge.org/BashFAQ/082

使用Perl 的额外解决方案:

ping -c 20 google.com |
    perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt
Run Code Online (Sandbox Code Playgroud)