Использование AWK и Fping для захвата положенных переменных в Bash - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь сохранить результаты fping в переменной в Bash, это должно быть легко, но я просто не могу заставить его работать.Я пробовал различные методы, пытался использовать такие вещи, как AWK и CUT для захваченной переменной, но получал пустые переменные.

Мой мыслительный процесс выглядит следующим образом.

  1. набрав fping 8.8.8.8 -c 2 дает мне вывод
8.8.8.8 : [0], 84 bytes, 15.1 ms (15.1 avg, 0% loss)
8.8.8.8 : [1], 84 bytes, 15.0 ms (15.0 avg, 0% loss)

8.8.8.8 : xmt/rcv/%loss = 2/2/0%, min/avg/max = 15.0/15.0/15.1
набрав fping -c 1 8.8.8.8 |awk '/ min /' возвращает только последнюю строку, что я и хочу.

8.8.8.8: xmt / rcv /% loss = 2/2/0%, min / avg/ max = 15,0 / 15,0 / 15,1

поэтому введите output = $ (fping -c 1 8.8.8.8 | awk '/ min /')

, и я ожидал сохранить эту последнюю строку в переменной, которую затем смогу затемпроцесс.Но вместо этого я получаю переменную BLANK, даже если она показывает строку, как показано ниже ??

$ output = $ (fping -c 1 8.8.8.8 | awk '/ min /')

8.8.8.8: xmt / rcv /% потерь = 1/1/0%, min / avg / max = 15,1 / 15,1 / 15,1

Сначала я также использовал AWK для извлеченияJsut значения 5 и 6 столбца, чтобы сделать пост-обработку проще

что-то вроде

output = $ (fping -c 1 8.8.8.8 | awk '/ min / {loss = $ 5, time = $ 6} ')

этот синтаксис на данный момент может быть неправильным, но дать переменную типа bwlow со всеми готовыми к извлечению значениями

"2 /2/0% 15,0 / 15,0 / 15,1 "

Что я делаю не так?Как я могу сохранить эту последнюю строку вывода в переменную?Я в порядке, разделяя это, но почему AWK не извлекает правильный бит и сохраняет это?

Спасибо

1 Ответ

0 голосов
/ 13 июня 2018

Вот полный полный, без сокращений вывод вашей попытки:

user@host$ output=$(fping -c 1 8.8.8.8 | awk '/min/')

8.8.8.8 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.66/0.66/0.66
user@host$

Тот факт, что вы получаете вывод на экран, имеет решающее значение, это означает, что данные не собираются.Это обычно означает, что данные записываются в stderr.Вот что вы получаете, когда перенаправляете стандартный вывод в stderr:

user@host$ output=$(fping -c 1 8.8.8.8 2>&1 | awk '/min/')
(no output)

, и действительно, переменная теперь имеет значение:

user@host$ printf '%s\n' "$output"
8.8.8.8 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.77/0.77/0.77
...