Я хочу получить результат 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 interface
case
- Если у вас есть аргумент, содержащий
*
,[
…]
или некоторые другие специальные символы,grep
это может привести к неожиданным результатам. Это, похоже, не будет проблемой в реальной жизни. - Если
fping
выводится какая-либо информация, которая не соответствует аргументу имени/адреса целевого хоста, вы ее не увидите. - Этот скрипт не завершается со статусом выхода из
fping
. Исправление этого оставлено в качестве упражнения.