grep
está retornando várias linhas bem:
$ while true; do
trap break SIGINT
ping -w 5 localhost | { trap '' SIGQUIT
ts '%Y-%m-%d %H:%M:%S |' |
grep -E 'PING|packets|rtt'
}
done
2015-11-07 17:28:50 | PING localhost (127.0.0.1) 56(84) bytes of data.
2015-11-07 17:28:55 | 6 packets transmitted, 6 received, 0% packet loss, time 4998ms
2015-11-07 17:28:55 | rtt min/avg/max/mdev = 0.027/0.035/0.042/0.005 ms
2015-11-07 17:28:55 | PING localhost (127.0.0.1) 56(84) bytes of data.
2015-11-07 17:29:00 | 6 packets transmitted, 6 received, 0% packet loss, time 4999ms
2015-11-07 17:29:00 | rtt min/avg/max/mdev = 0.024/0.040/0.052/0.009 ms
2015-11-07 17:29:00 | PING localhost (127.0.0.1) 56(84) bytes of data.
O problema é o read foo; echo foo
desnecessário que você está fazendo:
grep -E 'PING|packets|rtt' | { read grep_out
echo $grep_out
}
Ele lerá apenas uma linha da saída de grep
.
Como você só precisa inserir um snippet no começo e no final:
while true; do
trap break SIGINT
ping -w 5 10.0.0.1 | { trap '' SIGQUIT
ts '%Y-%m-%d %H:%M:%S |' | {
echo 'INSERT INTO test VALUES('
grep -E 'PING|packets|rtt'
echo ');EXIT;'
} |
mysql --user=user --password=pass
}
done
Exemplo:
$ while true; do
trap break SIGINT
ping -w 5 localhost | { trap '' SIGQUIT
ts '%Y-%m-%d %H:%M:%S |' | {
echo -n 'INSERT INTO test VALUES('
grep -E 'PING|packets|rtt'
echo -n ');EXIT;'
} |
cat
}
done
INSERT INTO test VALUES(2015-11-07 17:48:02 | PING localhost (127.0.0.1) 56(84) bytes of data.
2015-11-07 17:48:07 | 6 packets transmitted, 6 received, 0% packet loss, time 4996ms
2015-11-07 17:48:07 | rtt min/avg/max/mdev = 0.029/0.037/0.046/0.008 ms
);EXIT;
INSERT INTO test VALUES(^C%
Cuidado com citações e outros problemas de injeção de SQL.