fping – 如何使 fping 结果始终按命令行顺序排列

fping – 如何使 fping 结果始终按命令行顺序排列

fping我希望获得始终按照命令行参数的顺序连续的结果。

例如,命令:

fping -e 151.101.129.164 8.8.8.8

可能会给出输出:

8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)

上面的结果与命令参数的顺序不同fping,其中在命令151.101.129.164中放在第一位,fping但结果显示为第二个。

如何151.101.129.164在不改变第一个 fping 命令的顺序的情况下首先显示结果?

答案1

一种方法是编写包装脚本:

#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
        case "$arg" in
          (-*)  # Ignore options
                ;;
          (*)   grep "^$arg " "$myfile"
        esac
done
rm "$myfile"

因此,如果你调用此命令myfping并运行myfping -e 151.101.129.164 8.8.8.8 (你需要将./ 脚本添加到你的 PATH 目录中),它将运行

    fping -e 151.101.129.164 8.8.8.8
输出到临时文件,然后按命令行(从左到右)顺序遍历参数并按顺序提取结果。

笔记:

  • IPv4 地址解析器非常灵活;在大多数(如果不是全部)系统上,它将被解释127.0.1为等同于127.0.0.1。因此,如果您fping 127.0.1,和fping产生一行以 开头的输出127.0.1,并且您还有一个像 这样的参数1.7.0.1,它将被视为与 匹配的正则表达式127.0.1。您可以按如下方式克服这个问题:

    #!/bin/bash
    myfile=$(mktemp)
    ./fping "$@" > "$myfile"
    for arg
    do
            case "$arg" in
              (-*)  # Ignore options
                    ;;
              (*)   darg=$(sed 's/\./\\./g' <<< "$arg")
                    grep "^$darg " "$myfile"
            esac
    done
    rm "$myfile"
    

    其中argof1.7.0.1将被转换为dargof 1\.7\.0\.1,这将不匹配127.0.1

    上述脚本是 bash 特有的,因为有“here string”( )。你可以将以下行<<< "$arg"更改为,使其符合 POSIX 标准darg=

    darg=$(printf "%s" "$arg" | sed 's/\./\\./g')
    
  • 以上内容可能只是转移注意力的借口。如果fping 127.0.1fping 可能规范化地址并报告 的结果127.0.0.1;那么grep就不会发现该结果。或者可能不是;请检查 的版本fping
  • 如果您使用任何带有参数的选项,例如或,则我的脚本中的逻辑将把选项参数视为普通参数;即目标主机名/地址。这可能无关紧要。-c count-I interfacecase
  • 如果您的参数包含*[]或其他特殊字符,grep可能会产生意外结果。这在现实生活中似乎不太可能成为问题。
  • 如果fping输出任何与目标主机名/地址参数不对应的信息,您将看不到它。
  • 此脚本不会以 的退出状态退出fping。修复该问题留作练习。

相关内容