Я составляю презентацию для нетехнической аудитории. У меня есть программа, работающая на Bash, которая выводит непрерывный поток значений, некоторые из которых важны. Я хотел бы выделить важные результаты, поскольку они отображаются, чтобы аудитория могла понять их частоту. Проблема в том, что я не могу sed
работать на работающем потоке. Это работает нормально, если я положил результаты в файл, как в:
cat output.txt | sed "s/some text/some text bolded/"
Но если я попробую то же самое на работающем выводе, вот так:
command | sed "s/some text/some text bolded/"
sed
ничего не делает. Есть предположения?
Поскольку Ламберт был достаточно полезен, чтобы указать, мое высказывание, которое sed
ничего не делает, было расплывчатым. Происходит то, что программа выводит stdout
(я почти уверен, что она не пишет stderr
), как обычно, даже если она по каналу sed
.
Кажется, проблема в том, что команда вызывает вторую программу, которая затем выводит на стандартный вывод. Есть несколько строк, напечатанных первой программой; это я могу редактировать. Затем идет поток значений, напечатанный второй программой; это я не могу редактировать.
Методы Perl и awk тоже не работают.
источник
stdbuf -o0 command | sed "s/some text/some text bolded/"
?command|egrep 'some text|$'
g
полученную «глобальную» подстановку, в противном случае будет подставлено только первое вхождение в строке:sed "s/old/new/g"
Ответы:
Скорее всего, вывод команды буферизуется. Когда команда записывает в терминал, буфер сбрасывается на каждой новой строке, поэтому вы видите, что он появляется с ожидаемой скоростью. Когда команда записывает в канал, буфер очищается только тогда, когда он достигает нескольких килобайт, поэтому он сильно отстает. Таким образом, это стандартное поведение стандартной библиотеки ввода / вывода.
Чтобы заставить команду не буферизовать свой вывод, вы можете использовать
unbuffer
(из ожидаемого) илиstdbuf
(из GNU coreutils).источник
stdbuf
не работал (это упоминалось ранее, кстати), ноunbuffer
сделал !! Ты понятия не имеешь, как счастлив, что сделал меня.sed
сам по себе использует такой буфер (см. статью ChennyStar), поэтому приведенные здесь примеры могут не сработать, так как ониsed
являютсяcommand
буфером:cat /etc/passwd | unbuffer sed
ноsed
сам по себе имеет-u
опцию, поэтомуgrep
может быть более подходящим в этих примерах. Большое спасибо за вашу справочную информацию! Отличный ответ!sed
есть вариант для этого:Который загружает минимальные объемы данных из входных файлов и чаще очищает выходные буферы. Смотрите
man sed
для более подробной информации.источник
sed
Только GNU (не BSDsed
), и я считаю, что это все равно не помешает буферизации команды в начале канала. Но приятно упомянуть об этом. :)Я бы использовал awk
где
/some important stuff/
выберите важную строку, как в седеprintf "%c[31m%s%c[0m\n",27,$0,27 ;
напечатать краснымКлючевым моментом является то, что
command
следует очищать линии, но это должно быть в случае, если у вас много выходных данных.источник
awk
(используяsub()
илиgsub()
), в случае такой примитивной заменыsed
, безусловно, подходящий инструмент.Perl путь:
или с непрерывным выходом:
Скрипт bash для вывода
cont
:Тест с:
\x1b[1m
- жирный или повышенной интенсивности${1}
- обратная связь\x1b[0m
- сбросить все атрибутыВыход:
Больше кодов выхода здесь .
источник