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"
    

    где argиз 1.7.0.1будет преобразовано в dargиз 1\.7\.0\.1, что не будет соответствовать 127.0.1.

    Приведенный выше скрипт специфичен для bash из-за «строки here» ( <<< "$arg"). Вы можете сделать его совместимым с POSIX, изменив darg=строку на

    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. Исправление этого оставлено в качестве упражнения.

Связанный контент