На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
AgentSS
Сообщения: 71
Сообщение
AgentSS » 20.05.2010 09:29
как можно разобрать вывод программы в консоли без использования временных файлов типа лога
Например вывод 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
Сообщение
eddy » 20.05.2010 09:36
grep + sed + awk (ну или только awk, если хорошо прочитаете его man).
RTFM
-------
KOI8-R - патриотичная кодировка
AgentSS
Сообщения: 71
Сообщение
AgentSS » 20.05.2010 09:55
eddy писал(а): ↑ 20.05.2010 09:36
grep + sed + awk (ну или только awk, если хорошо прочитаете его man).
не могу заставить их работать с "живым" выводом
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo
Сообщение
/dev/random » 20.05.2010 10:02
flac блаблабла 2>&1 | tr '\r' '\n' | grep -o '[0-9]\+%'
Не проверял.
AgentSS
Сообщения: 71
Сообщение
AgentSS » 20.05.2010 10:16
/dev/random писал(а): ↑ 20.05.2010 10:02
flac блаблабла 2>&1 | tr '\r' '\n' | grep -o '[0-9]\+%'
выводит результат после завершения работы флака
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo
Сообщение
/dev/random » 20.05.2010 10:25
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
Сообщение
AgentSS » 20.05.2010 10:30
А если в grep добавить "--line-buffered"?
Или заменить grep на
sed -nu 's/.* \([0-9]\+%\).*/\1/p'
?
Не на чем проверить.
тоже самое, выводит результат после завершения работы флака
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 20.05.2010 10:41
В «живом» выводе от флака нет переводов строк, поэтому все программы пытаются засосать весь вывод целиком, как одну строку. Они ж построчные. Надо awk'у указать другой разделитель записей (record separator). Какой — смотрите вывод флака в hex и придумывайте :)
AgentSS
Сообщения: 71
Сообщение
AgentSS » 20.05.2010 10:46
watashiwa_daredeska писал(а): ↑ 20.05.2010 10:41
В «живом» выводе от флака нет переводов строк, поэтому все программы пытаются засосать весь вывод целиком, как одну строку. Они ж построчные. Надо awk'у указать другой разделитель записей (record separator). Какой — смотрите вывод флака в hex и придумывайте
| tr '\r' '\n' переводит в новую строку, но всеравно непомогает
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 20.05.2010 11:18
tr буферизует ввод-вывод, поэтому лучше awk -v RS='\r' '{print}'
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 20.05.2010 12:16
imho, это уже к программированию относится: надо вносить изменения в саму программу, чтобы она по-человечески умела выдавать лог,
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Сообщение
Hephaestus » 20.05.2010 13:36
AgentSS писал(а): ↑ 20.05.2010 09:29
как можно разобрать вывод программы в консоли без использования временных файлов типа лога
Посмотрите
здесь , нужно что-то вроде этого?
Вообще на этой страничке есть чего интересного.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 21.05.2010 02:59
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.
Но проще исправить исходный текст.
gluk47
Сообщения: 297
Статус: Любитель гвоздей и микроскопов
ОС: Kubuntu 17.10
Сообщение
gluk47 » 23.05.2010 20:04
По-моему, проще написать свой исходный текст) Что-то вроде
Код:
#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
Сообщение
drBatty » 27.05.2010 21:14
gluk47 писал(а): ↑ 23.05.2010 20:04
Работает несколько медленнее, чем успевает выводить mplayer, но, наверное, не медленнее, чем конвейер из tr, sed и awk)
конечно.