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"
    

    其中 an argof1.7.0.1將被轉換為 a dargof 1\.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 interfacecase
  • 如果您的參數包含*[...]或其他一些特殊字符,grep可能會產生意外的結果。這在現實生活中似乎不太可能成為問題。
  • 如果fping輸出任何與目標主機名稱/位址參數不對應的訊息,您將看不到它。
  • 該腳本不會以退出狀態退出fping。解決這個問題留作練習。

相關內容