Оформление консольного вывода

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

AgentSS
Сообщения: 71

Оформление консольного вывода

Сообщение AgentSS »

как можно разобрать вывод программы в консоли без использования временных файлов типа лога

Например вывод flac имеет вид:

Код: Выделить всё

flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007  Josh Coalson
flac comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are
welcome to redistribute it under certain conditions.  Type `flac' for details.

1.wav: 11% complete, ratio=0,395


и нужно привести его к виду:
что-то: 11%

Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Оформление консольного вывода

Сообщение eddy »

grep + sed + awk (ну или только awk, если хорошо прочитаете его man).
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
AgentSS
Сообщения: 71

Re: Оформление консольного вывода

Сообщение AgentSS »

eddy писал(а):
20.05.2010 09:36
grep + sed + awk (ну или только awk, если хорошо прочитаете его man).

не могу заставить их работать с "живым" выводом
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Оформление консольного вывода

Сообщение /dev/random »

flac блаблабла 2>&1 | tr '\r' '\n' | grep -o '[0-9]\+%'

Не проверял.
Спасибо сказали:
AgentSS
Сообщения: 71

Re: Оформление консольного вывода

Сообщение AgentSS »

/dev/random писал(а):
20.05.2010 10:02
flac блаблабла 2>&1 | tr '\r' '\n' | grep -o '[0-9]\+%'


выводит результат после завершения работы флака
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Оформление консольного вывода

Сообщение /dev/random »

AgentSS писал(а):
20.05.2010 10:16
/dev/random писал(а):
20.05.2010 10:02
flac блаблабла 2>&1 | tr '\r' '\n' | grep -o '[0-9]\+%'


выводит результат после завершения работы флака

А если в grep добавить "--line-buffered"?
Или заменить grep на
sed -nu 's/.* \([0-9]\+%\).*/\1/p'
?

Не на чем проверить.
Спасибо сказали:
AgentSS
Сообщения: 71

Re: Оформление консольного вывода

Сообщение AgentSS »

А если в grep добавить "--line-buffered"?
Или заменить grep на
sed -nu 's/.* \([0-9]\+%\).*/\1/p'
?

Не на чем проверить.

тоже самое, выводит результат после завершения работы флака
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Оформление консольного вывода

Сообщение watashiwa_daredeska »

В «живом» выводе от флака нет переводов строк, поэтому все программы пытаются засосать весь вывод целиком, как одну строку. Они ж построчные. Надо awk'у указать другой разделитель записей (record separator). Какой — смотрите вывод флака в hex и придумывайте :)
Спасибо сказали:
AgentSS
Сообщения: 71

Re: Оформление консольного вывода

Сообщение AgentSS »

watashiwa_daredeska писал(а):
20.05.2010 10:41
В «живом» выводе от флака нет переводов строк, поэтому все программы пытаются засосать весь вывод целиком, как одну строку. Они ж построчные. Надо awk'у указать другой разделитель записей (record separator). Какой — смотрите вывод флака в hex и придумывайте :)

| tr '\r' '\n' переводит в новую строку, но всеравно непомогает
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Оформление консольного вывода

Сообщение watashiwa_daredeska »

tr буферизует ввод-вывод, поэтому лучше awk -v RS='\r' '{print}'
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Оформление консольного вывода

Сообщение sash-kan »

imho, это уже к программированию относится: надо вносить изменения в саму программу, чтобы она по-человечески умела выдавать лог,
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Оформление консольного вывода

Сообщение Hephaestus »

AgentSS писал(а):
20.05.2010 09:29
как можно разобрать вывод программы в консоли без использования временных файлов типа лога


Посмотрите здесь, нужно что-то вроде этого?
Вообще на этой страничке есть чего интересного.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Оформление консольного вывода

Сообщение drBatty »

AgentSS писал(а):
20.05.2010 09:29
как можно разобрать вывод программы в консоли без использования временных файлов типа лога

Например вывод flac имеет вид:

не имеет оно такого вида!
а имеет вид такой:

Код: Выделить всё

Encoding as 44.1 kHz 128 kbps j-stereo MPEG-1 Layer III (11x) qval=2
^M    Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA
     0/       ( 0%)|    0:00/     :  |    0:00/     :  |         x|     :  ^M^M     0/109185 ( 0%)|    0:00/    0:00|    0:00/    0:00|   0.0000x|    0:00 ^M
50/109185 ( 0%)|    0:00/    2:11|    0:00/    3:06|   21.769x|    3:05 ^M   100/109185 ( 0%)|    0:00/    2:54|    0:00/    3:23|   16.327x|    3:22 ^M
150/109185 ( 0%)|    0:00/    3:09|    0:00/    3:36|   15.071x|    3:36 ^M   200/109185 ( 0%)|    0:00/    3:21|    0:00/    3:39|   14.120x|    3:38 ^M
250/109185 ( 0%)|    0:00/    3:25|    0:00/    3:40|   13.895x|    3:40 ^M   300/109185 ( 0%)|    0:00/    3:27|    0:00/    3:41|   13.749x|    3:41 ^M^M
350/109185 ( 0%)|    0:00/    3:29|    0:00/    3:43|   13.646x|    3:42 ^M   400/109185 ( 0%)|    0:00/    3:32|    0:00/    3:45|   13.396x|    3:44 ^M
450/109185 ( 0%)|    0:00/    3:35|    0:00/    3:47|   13.208x|    3:46 ^M   500/109185 ( 0%)|    0:01/    3:38|    0:01/    3:49|   13.061x|    3:48 ^M

здесь ^M означает - возврат каретки, без перехода к новой строке. потому вывод идёт в одной строке (с виду)

попробуйте заменять символ \r на \n (с этим возникнут трудности, ведь символов \n нет, и весь вывод - ОДНА строка, а все утилиты обрабатывают текст построчно), а затем парсить вывод, причём в динамике, так-же как flac заканчивая вывод символом \r.

Но проще исправить исходный текст.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gluk47
Сообщения: 297
Статус: Любитель гвоздей и микроскопов
ОС: Kubuntu 17.10

Re: Оформление консольного вывода

Сообщение gluk47 »

По-моему, проще написать свой исходный текст) Что-то вроде

Код:

#include <stdio.h> int main() { int status; char prefix[256], postfix[256]; prefix[255] = prefix[0] = postfix[255] = postfix[0] = 0; while ((status = scanf("%255c%%255c", prefix, postfix)) != EOF) { printf(status == 2?"parser> «%s»%%«%s»\r" : "parser> «%s»\r", prefix, postfix); //warning: лишний параметр printf if (status < 2) fflush(stdout); } return 0; }

Работает несколько медленнее, чем успевает выводить mplayer, но, наверное, не медленнее, чем конвейер из tr, sed и awk)
[gluk47@gluk47-desktop ~]$ ензу куищще
куищще is aliased to `reboot'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Оформление консольного вывода

Сообщение drBatty »

gluk47 писал(а):
23.05.2010 20:04
Работает несколько медленнее, чем успевает выводить mplayer, но, наверное, не медленнее, чем конвейер из tr, sed и awk)

конечно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: