Я хочу получить только количество мс из команды ping в файл. Без конвейеризации в файл все работает как задумано. Я немного не понимаю, почему > в файл ничего не пишет.
Это работает:
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'
Это ничего не записывает в ping.dat
ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat
Что я делаю не так?
решение1
Каждый из |
них потенциально окружен буфером вывода stdio и буфером ввода stdin. Вам нужно выяснить, какой из них нужно отключить, чтобы получить конвейеризацию в реальном времени.
Мне это подходит:
ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file
Сначала я ставил stdbuf -i0 -o0
перед каждой командой, а потом выяснял, какие из них были лишними.
решение2
Если вы используете GNU, то, похоже, -l
опция sed неверна: вам, вероятно, нужна -u
опция (небуферизованная). Кроме того, лишнее grep
. Вы должны иметь возможность получить то, что вам нужно, просто с помощью sed:
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
Функция -n
подавляет обычный вывод сопоставления, а функция s///p
принудительно включает вывод сопоставленных строк.