我想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"
其中 an
arg
of1.7.0.1
將被轉換為 adarg
of1\.7\.0\.1
,這將不匹配127.0.1
。由於「此處字串」(
<<< "$arg"
),上述腳本是特定於 bash 的。您可以透過將darg=
行更改為來使其符合 POSIX 標準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
。解決這個問題留作練習。