LINUX.ORG.RU

Вывод двух значений из разных строк с помощью awk

 ,


0

2

Всем привет. Для системы мониторинга сети в офисе нужно сделать скрипт который каждый 5 минут будет кидать по 4 пинга на разные хосты и писать лог. Далее уже эти данные будут выводиться на внутреннем вебсайте. В общем скрипт выглядит вот так :

#!/bin/bash
HOSTS="**.**.**.**"

COUNT=4

for myHost in $HOSTS
do
  count=$(ping -c $COUNT $myHost | awk -F "/" '$2 ~ /avg/ {print $6}' | awk '/received/ {print $6}' >> ./result)

Проблема в том он не записывает данные в таком виде и я не могу понять почему.

Если я отдельно выполню

ping -c $COUNT $myHost | awk -F "/" '$2 ~ /avg/ {print $6}'>> ./result
или
ping -c $COUNT $myHost | awk '/received/ {print $6}' >> ./result
То данные записываются. В первом случаи это среднее значение времени ответа из строки :
rtt min/avg/max/mdev = 1.996/2.614/2.972/0.370 ms

Во тором это количество потерь из строки :

4 packets transmitted, 4 received, 0% packet loss, time 3003ms

В логе мне нужны всего два эти значения :

0%
(или более, тогда на php будет обработка что есть потери и нужно алармить) и
2.614
(как и в первом случаи)

Почему по отдельности записывает данные, а если пишу оба условия, то вообще ничего не пишет.


Вы меня извините, но я вижу, что вы передаете данные в авк, - выбираете значение, - результат падаете на второй вызов авк, а там естественно нет той фразы по который вы выуживаете данные. Сделайте два вызова в переменные, а потом их запишите в файл.

Silerus ★★★★
()
Ответ на: комментарий от Silerus

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

Sp1DeR
() автор топика
Ответ на: комментарий от Sp1DeR

Можно так:

# сохранить вывод ping в переменную
pingout="$(ping -c $COUNT $myHost)"
# обработать вывод дважды
awk -F "/" '$2 ~ /avg/ {print $6}' <<< "$pingout" >> ./result
awk '/received/ {print $6}' <<< "$pingout" >> ./result

xaizek ★★★★★
()

возьми бинарник check_ping из пакета nagios-plugins и не морочь голову

futurama ★★★★★
()
Ответ на: комментарий от xaizek

Огромное спасибо. Это то что я искал.

Правда вот еще только что сделал второй вариант, но это костыли :

count=$(ping -c $COUNT $myHost >> ./test ; awk '/received/ {print $6}' ./test >> ./result ; awk -F "/" '$2 ~ /avg/ {print $6}' ./test >> ./result ; rm ./test)[/bash]
Sp1DeR
() автор топика

как из одного вызова пинг выбрать два значения

read A B < <(ping -c1 example.org | perl -0ne 'print if s/.*received, ([[:digit:]]+)% .* = [[:digit:].]+\/([[:digit:].]+)\/.*/\1 \2/s'); echo $A:$B
ArcFi
()

HOSTS="**.**.**.**"
for myHost in $HOSTS

Я не понял, что это такое.

#!/bin/bash
| awk -F "/" '$2 ~ /avg/ {print $6}' | awk '/received/ {print $6}'

Вот ваша проблема — вы не можете определиться, на каком языке вы пишете. Как только вы определитесь, так немедленно напишете работающую и *сопровождаемую* программу, а не это, и не тот набор палочек и черточек, что вам советуют здесь отдельные товарищи.

Ну допустим, вы таки выбрали ГНУ Баш:

#!/bin/bash

host="$1"
count=4

while read -r line; do
    case "$line" in
        *'packet loss'*)
            IFS=',' \
               read -r tx rx loss t <<< "$line"
            loss="${loss%%\%*}"
            ;;
        'rtt'*)
            IFS+='/' \
                read -r _rtt _min _avg _max _mdev _eq min max avg mdev _ms \
                <<< "$line"
            ;;
    esac
done < \
     <(ping -c "$count" "$host")

printf '%s %d%% %.3f\n' "$host" "$loss" "$avg"
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

сопровождение выхлопа ping, лол

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.