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