LINUX.ORG.RU

[Сломал голову]Сохранение порядка вывода


0

0

Есть команда. Например sudo aptitude install xfce

Её вывод вот такой:

Чтение списков пакетов... Готово
.....
Чтение описаний задач... Готово
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
.....

Я хочу убрать повторение (опять-же, это всё пример). Делаю некие манипуляции с awk/uniq, и вывод становится вот таким:

...
Чтение описаний задач... Готово
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
...

Теперь я хочу выделить это предложение при помощи седа. Делаю sed s/Не\ удалось/\ Не\ удалось/g

В результате чего команда принимает вот такой вид:

...
Чтение описаний задач... Готово
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
...

Т.е добавилась табуляция. Теперь хочу совместить результаты работы awk и седа. Делаю так:

sudo aptitude install xfce |awk 'some_command' |sed -e 'blah_blah'

Вывод команды правильные, т.е

...
Чтение описаний задач... Готово
Не удалось найти пакет "xfce", и более чем 40 пакетов содержат "xfce" в своём имени.
...

Однако порядок вывода нарушается, т.е весь вывод аптитуды вываливается на ст.вывод _одновременно_. Вот так:

Чтение списков пакетов...Построение дерева зависимостей...
Чтение информации о состоянии...Чтение информации о расширенных состояниях...
Инициализация состояний пакетов...Чтение описаний задач...

И так далее

А должно быть так:

Чтение списков пакетов...Построение дерева зависимостей... (небольшая пауза перед выводом следующей строки)
Чтение информации о состоянии...Чтение информации о расширенных состояниях... (пауза)
Инициализация состояний пакетов...Чтение описаний задач... (пауза)

Вот такой у меня странный вопрос.

Насколько я знаю, sed работает с "готовыми" текстами, т.е. не разбирает текст на ходу. Аналогично less. Так что придется тебе искать другие способы.

Небольшая мысль по этому поводу: for i in $(seq -w 15); do echo $i; sleep 5; done > /tmp/p & tail -f /tmp/p - все будет появляться вовремя, т.е. в файл поток пишется сразу.

Попробуй писать вывод в некоторый файл и каждые N секунд парсить этот файл.

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

>Насколько я знаю, sed работает с "готовыми" текстами, т.е. не разбирает текст на ходу.

Я всегда думал что наоборот Оо sed читает на ходу, а ed из файла. Но если запустить sed без ничего, т.е sudo aptitude install xfce |sed s/Some_text/some_Text/g то всё нормально, порядок вывода правильный, а если сделать конвеер и прилепить за седом, например, awk, то ничего не выходит.

>Небольшая мысль по этому поводу: for i in $(seq -w 15); do echo $i; sleep 5; done > /tmp/p & tail -f /tmp/p - все будет появляться вовремя, т.е. в файл поток пишется сразу.

Тогда будет задержка перед выводом, если я правильно понял идею. Т.е сначала отработает сед, передаст всё в файл, а оттуда будет читать awk. Тогда получится то-же самое, но с задержкой в начале. :-(

ZZaiatSS ★★
() автор топика

убери sed -- лишняя сущность
в awk'e используй fflush() для сброса буфера в stdout

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

Спасибо! Но, увы, это только половина проблемы. Я юзаю не только sed и awk, но ещё и acoc (раскрашиватель) и ещё пару утилит, так-что всё-равно придётся искать другой выход :-(

>а pife + fifo не оно?

О, класс, кажется что оно, буду смотреть. Спасибо!

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