pipe не записывает в файл

pipe не записывает в файл

Я хочу получить только количество мс из команды 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принудительно включает вывод сопоставленных строк.

Связанный контент