Я хочу получить результат 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 ответ1

0

Один из способов - написать скрипт-обертку:

#!/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 из-за "строки здесь" (<<< "$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 .  Исправление оставлено в качестве упражнения.

    Всё ещё ищете ответ? Посмотрите другие вопросы с метками .