Привет!
grep < /dev/ttyd0 - работает как надо
cat /dev/ttyd0 > out.file - аналогичноно
grep < /dev/ttyd0 > out.file - НЕ РАБОТАЕТ !!!
часа два я ужо и так и этак ... - не дается :(В ЧЕМ ГРАБЛИ ??!
p.s.
grep < in.file > out.file - работает :( :)
>Привет!
.
>grep < in.file > out.file - работает :( :)Похоже дело в том, что тут ты ^C не давишь - код возврата из grep нормальный...
Так не подойдет?
while read text; do echo "$text" | grep PATTERN >> OUTFILE ; done
или что ты сделать хотел?
>>grep < in.file > out.file - работает :( :)
>
>Похоже дело в том, что тут ты ^C не давишь - код
>возврата из grep нормальный...
>
>Так не подойдет?
>
>while read text; do echo "$text" | grep PATTERN >> OUTFILE ; done
>
>или что ты сделать хотел?не только хотел, но и делаю :)
на com порт сыпятся текстовые строкиcat /dev/ttyd0 - выкидывает все на терминал или в файл ( > file.out )
grep PATTERN < /dev/ttyd0 - реально фильтрует и на терминал выводит,
а вот в файл, что удивительно, не пишет (перенаправлением) :(
>>>grep < in.file > out.file - работает :( :)
>>
>>Похоже дело в том, что тут ты ^C не давишь - код
>>возврата из grep нормальный...
>>
>>Так не подойдет?
>>
>>while read text; do echo "$text" | grep PATTERN >> OUTFILE ; done
>>
>>или что ты сделать хотел?
>
>не только хотел, но и делаю :)
>на com порт сыпятся текстовые строки
>
>cat /dev/ttyd0 - выкидывает все на терминал или в файл ( > file.out )
>grep PATTERN < /dev/ttyd0 - реально фильтрует и на терминал выводит,
>а вот в файл, что удивительно, не пишет (перенаправлением) :(
[syslha@main syslha]$ tty
/dev/pts/3
[syslha@main syslha]$ mkdir test
[syslha@main syslha]$ cd test
[syslha@main test]$ grep a < /dev/pts/3 >> outfile ; echo "exit code - $?"
bebebe
blablabla
bububuдавим ^C
exit code - 130
[syslha@main test]$ ls
outfile
[syslha@main test]$ cat outfile
[syslha@main test]$ grep a < /dev/pts/3 >> outfile ; echo "exit code - $?"
blablabla
bebebe
bububu
aaaaaaaaaaaaaaaaaaaaaa-aaaaaaaaaaaaa-aaaaaaaaaaaдавим ^D
exit code - 0
[syslha@main test]$ ls
outfile
[syslha@main test]$ cat outfile
blablabla
aaaaaaaaaaaaaaaaaaaaaa-aaaaaaaaaaaaa-aaaaaaaaaaa
[syslha@main test]$
/usr/tmp > grep a < /dev/ttyp0 > outfile
bababa
bububu
blablabla
- тут жму ^D
/usr/tmp > cat outfile
bababa
blablabla
- все предсказуемо
/usr/tmp > grep a < /dev/ttyd0 > outfile
// жду 10 сек
- на ^D не реагирует
- жму ^C
/usr/tmp > ls -l
total 0
-rw-r--r-- 1 root wheel 0 Oct 23 14:54 outfileдля примера:
/usr/tmp > cat /dev/ttyd0 > outfile
// жду 10 сек
^C
/usr/tmp > cat outfile
bababa
bububu
bababa
bububu
bababa
bububu
bababa
bububu
bababa
bububu
bababa
bububu
bababa
bububu
/usr/tmp >вот и не пойму в чем дело!
может кеширование записи ??? - как тогда подавить ее, чтоб сразу писать построчно файлвчера уже на С написал, но grep то тоже должен работать !
да, FreeBSD4.7
>для примера:
>/usr/tmp > cat /dev/ttyd0 > outfile
>// жду 10 сек
>^CЗдесь у тебя grep'а нет, который при ^C дает ненормальный код завершения - похоже из за этого файл и не записывается
>вот и не пойму в чем дело!
>может кеширование записи ??? - как тогда подавить ее, чтоб сразу писать
>построчно файл
>
>вчера уже на С написал, но grep то тоже должен работать !
>
>да, FreeBSD4.7посмотри самый первый пример, который я давал - там отдельно обрабатывается каждая строка ввода и скармливается grep'у (соответственно он нормально завершаться и строка тутже попадает в файл). то есть делай так:
cat /dev/ttyd0 | while read text ; do echo "text" | greg PATTERN >> OUTFILE ; done
>cat /dev/ttyd0 | while read text ; do echo "text" | greg PATTERN >> OUTFILE ; doneОчепятка - надо:
cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN >> OUTFILE ; done
>
>cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN >> OUTFILE ; doneНЕ РАБОТАЕТ. полчаса ждал - просто нулевой файл. :(
cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done
по-прежнему прокатывает легко (на экран).
мистика или ... на этом мысль заканчивается :)
>>
>>cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN >> OUTFILE ; done
>
> НЕ РАБОТАЕТ. полчаса ждал - просто нулевой файл. :(
>
>cat /dev/ttyd0 | while read text ; do echo "$text" | greg
>PATTERN ; done
>
>по-прежнему прокатывает легко (на экран).
>
>мистика или ... на этом мысль заканчивается :)а ты точно >> OUTFILE написал, а не > OUTFILE ? Иначе у тебя при обработке каждой строки старые данные будут затираться. В результате получишь файл нулевой длины (если последняя строка под PATTERN не попадет) или файл с всего одной строкой.
Почаса ждать не обязательно - как только данные попадают на /dev/ttyd0 они должны переноситься в файл тут же (поставь для теста PATTERN попроще и следи за изменением размера OUTFILE)
>
>а ты точно >> OUTFILE написал, а не > OUTFILE ? Иначе у тебя при обработке каждой строки старые данные будут затираться. В результате получишь файл нулевой длины (если последняя строка под PATTERN не попадет) или файл с всего одной строкой.не готов согласиться, почему это будет затираться ??
но вдаваться дальше пока не буду :)>
>Почаса ждать не обязательно - как только данные попадают на /dev/ttyd0 они
>должны переноситься в файл тут же (поставь для теста PATTERN попроще
>и следи за изменением размера OUTFILE)да, именно >> ставил !
запускал и с другого терминала заходил смотрел,
и в фон отправлялглядел - OUTFILE расти НЕ ХОЧЕТ !!
от cat - растет посекундно, от grep - ну ни как !
добавлю кстатиgrep a < /dev/ttyp0 >> outfile
и на клавиатуре
baba
bubu
dfdf
caca
и т.д.останавливаюсь захожу с другого терминала:
файл - НУЛЕВЫЙ !^D - на первом терминале
смотрю со второго - ВСЕ В ПОРЯДКЕ , отгреплено и записано!получается, что grep и со stdin в файл построчно писать не хочет !
вот :(
>добавлю кстати
>
>grep a < /dev/ttyp0 >> outfile
>и на клавиатуре
>baba
>bubu
>dfdf
>caca
>и т.д.
>
>останавливаюсь захожу с другого терминала:
>файл - НУЛЕВЫЙ !
>
>^D - на первом терминале
>смотрю со второго - ВСЕ В ПОРЯДКЕ , отгреплено и записано!
>
>получается, что grep и со stdin в файл построчно писать не хочет
>!
>вот :(
>
>получается, что grep и со stdin в файл построчно писать не хочет
>!
>вот :(
Так для этого я цикл и предлагаю сделать - чтобы построчно обрабатывал и тут же записывал. Попробуй так:( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE
У меня к сожалению с порта читать нечего, но при чтении с консоли все работает нормально (а как кстати у тебя?) - так, что окончательная проверка опять за тобой :)
приведи кстати примерчик чего тебе cat /dev/ttyd0 на консоль выдает - может просто под твою PATTERN ничего не попадает...
>>
>>а ты точно >> OUTFILE написал, а не > OUTFILE ? Иначе у тебя при обработке каждой строки старые данные будут затираться. В результате получишь файл нулевой длины (если последняя строка под PATTERN не попадет) или файл с всего одной строкой.
>
>не готов согласиться, почему это будет затираться ??
>но вдаваться дальше пока не буду :)
>потому что > создает файл (или усекает существующий), а после этого записывает данные. так что при обработке второй строки внутри цикла, результаты обработки первой будут уничтожены (если они к тому времени были в файле). а >> будет дописывать информацию в конец файла и позволит этого избежать.
a. понятно, и конечно согласен. в цикле конечно дОлжно ставить именно >>
просто я на цикле изначально не зацикливался :)
b. На порт сыпется именно то что приведено выше (message 5. "ttyd0 vs ttyp0"). Там все - ИСТИНА (копия с экрана). Специально слеплен посекундный посылатель строк (bababa bububu) в порт (вот оно маниакальное желание прокопать самому - не всех дураков еще война поубивала :о) )Итого
1. простая конструкция грепа с вводом строк с ряда последовательных устройств типа ttyp0 (stdin!!!), ttyd0, не работает на вывод в файл !!!
2. Чтоб заставить грепа грепить в файл надо лепить жуткую (ИМХО) конструкцию типа
( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE
Спасибо !
сам думаю до такого не дошел бы :)
3. чем шеллить таким циклом кажется правильнее запустить набранную прогу на fgets() и fputs().
4. :) несколько подрывается вера в unix просто решать простую задачку :)
5. может пп. 3 и 4 не верны и проблемка с другой стороны от терминала? :)
может я сразу не в ту сторону побрел?
может тут не грепом надо??? (фильтровать строки и СРАЗУ писать в файл)
тогда чем ?Еще раз СПАСИБО! Бум делать!
>a. понятно, и конечно согласен. в цикле конечно дОлжно ставить именно >>
>просто я на цикле изначально не зацикливался :)
>b. На порт сыпется именно то что приведено выше (message 5. "ttyd0
>vs ttyp0"). Там все - ИСТИНА (копия с экрана). Специально слеплен
>посекундный посылатель строк (bababa bububu) в порт (вот оно маниакальное желание
>прокопать самому - не всех дураков еще война поубивала :о)
>):)))
>
>Итого
>1. простая конструкция грепа с вводом строк с ряда последовательных устройств типа
>ttyp0 (stdin!!!), ttyd0, не работает на вывод в файл !!!Работает, если grep нормально завершается - я это в п. 4 показал
>2. Чтоб заставить грепа грепить в файл надо лепить жуткую (ИМХО) конструкцию
>типа
>( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILEНу не такая уж она и жуткая :), а потом я ведь выдал только то, что первое в голову пришло - возможно есть решения и проще. Как все-таки эта конструкция срабатывает у тебя при чтении с консоли и из порта (просто у меня RH - я на нем пробовал)
>Спасибо !
>сам думаю до такого не дошел бы :)
>3. чем шеллить таким циклом кажется правильнее запустить набранную прогу на fgets()
>и fputs().В общем-то есть резон, но скорее для более серьезных задач, или если скорость обработки данных очень критична (хотя тут опять могут быть сотни за и против...)
>4. :) несколько подрывается вера в unix просто решать простую задачку :)
>Совершенно верно - просто решать простую задачку. Только непонятно, как эта мысль, которую можно применить абсолютно ко всему, подрывает веру в unix (или я неправильно понял?)?
>5. может пп. 3 и 4 не верны и проблемка с другой
>стороны от терминала? :)
>может я сразу не в ту сторону побрел?
>может тут не грепом надо??? (фильтровать строки и СРАЗУ писать в файл)
>Может быть, но мне уже просто интересно именно греп победить (видать я тоже один из тех, кого война не поубивала :)
>тогда чем ?
>
>Еще раз СПАСИБО! Бум делать!Отпиши что получилось
ссори если нечетко написал :)( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE
РАБОТАЕТ !!!
т.е. опускаю ету жуть :) в фон и смотрю: файл постоянно прирастает правильными отфильтрованными строками - ОК!>Ну не такая уж она и жуткая :)
жуткая конечно только в смысле соответствия ОЧЕНЬ ПРОСТОЙ решаемой задачисобственно ЗАДЕЛ внезапный стопор по простому вопросу,
и казалось даже не по грепу :
< /dev/ttyd0 - это шелловская фитча, ну да, формат потока должен поедаться грепом, тут в принципе могут быть(?) непонятки и нестыковки,
и естественно работает!НО !!! :
> outfile - это только шелл !!!!!!!
если уж греп сьел поток и может выкидывать построчно данные на терминал (stdout!),
ТО ПОЧЕМУ ШЕЛЛ НЕ МОЖЕТ ЗАВЕРНУТЬ ВЫВВОД В ФАЙЛ ВМЕСТО SDTOUT????? ТУТ УЖЕ ГРЕП НИ ПРИ ПИ#$@Е. ну совсем ни при чем вроде :о) , он уже отработал.
а раз не может, значит это МОЕ непонимание процесса (простого??? перенаправления вывода), повторюсь вот это и задело.а так что, вопрос пустяшный :)
в стране вон, что творится :(
и еще "пару слов без протокола"досадно, что мало кого задел вопрос
ну ни нашел я никаких особенностей про греп в man grepа ведь вопрос вроде простой и по элементарной теме - перенапраление вывода.
про это пишут в разных книгах на первых страницах.шо - никто не знает, почему все это так? ( МЭТРЫ, АУ! )
или считют что "это элементарно" и пусть два дурака стебаются
%SUBJ
>ссори если нечетко написал :)
>
>( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE
>
>РАБОТАЕТ !!!
>т.е. опускаю ету жуть :) в фон и смотрю: файл постоянно прирастает
>правильными отфильтрованными строками - ОК!
>Ну слава богу !!!
>>Ну не такая уж она и жуткая :)
>жуткая конечно только в смысле соответствия ОЧЕНЬ ПРОСТОЙ решаемой задачи
>
>собственно ЗАДЕЛ внезапный стопор по простому вопросу,
>и казалось даже не по грепу :
>< /dev/ttyd0 - это шелловская фитча, ну да, формат потока должен поедаться
>грепом, тут в принципе могут быть(?) непонятки и нестыковки,
>и естественно работает!
>
>НО !!! :
>> outfile - это только шелл !!!!!!!
>если уж греп сьел поток и может выкидывать построчно данные на терминал
>(stdout!),
>ТО ПОЧЕМУ ШЕЛЛ НЕ МОЖЕТ ЗАВЕРНУТЬ ВЫВВОД В ФАЙЛ ВМЕСТО SDTOUT????? ТУТ
>УЖЕ ГРЕП НИ ПРИ ПИ#$@Е. ну совсем ни при чем вроде
>:о) , он уже отработал.
>а раз не может, значит это МОЕ непонимание процесса (простого??? перенаправления вывода),
>повторюсь вот это и задело.
>Опять повторяюсь, но видимо так туманно об'яснял - отработать-то он отработал, но вот нормально завершился или нет? Когда ты посылаешь данные на консоль, то система отображает их тутже, а при записи в файл - 100% кеширует. Поэтому когда греп завершается с кодом ошибки, система просто не записывает данные на диск - и правильно делает.
А поскольку ^D у тебя не срабатывал (т.е. нормально утихомирить греп не удавалось) я и предложил обрабатывать данные маленькими порциями (ввел цикл), чтобы при обработке такой порции греп всегда завершался нормально (и как результат данные записывались на диск).
Так что собственно само переопределение выходного потока здесь не причем, тут ты все правильно понимал и делал. Система честно перенаправляет вывод туда, куда ты ей указал (см. опять же п.4) - ключевой момент в том, что работает она с консолью и файлами ПО РАЗНОМУ.
>а так что, вопрос пустяшный :)
Вопрос самое то - на таких мелочах и надо разбираться
>в стране вон, что творится :(
И не говори... :))))))
про кеширование:
1. было ужо ;)
гыы
я писал, что ждал пол часа, а ты мне в ответ, что нефиг ждать :))
ладно седня
grep < /dev/ttyd0 >> outfile на сутки в фон оставлю
=> только завтра сообщю:)2. а че ж тогда
cat /dev/ttyd0 > outfile - ну совсем не кешируется ??? :)ну и серьезно
3. как подавить кеширование для конкретного процесса ?
>про кеширование:
>1. было ужо ;)
>гыы
>я писал, что ждал пол часа, а ты мне в ответ, что
>нефиг ждать :))я писал про конструкцию с циклом, а там действительно ждать нефиг
>ладно седня
>grep < /dev/ttyd0 >> outfile на сутки в фон оставлю
>=> только завтра сообщю:)думаю так долго ждать нет необходимости - попробуй через полчасика sync дать, а вообще - это уже фигней заниматься
>
>2. а че ж тогда
>cat /dev/ttyd0 > outfile - ну совсем не кешируется ??? :)
>кешируется, только cat с нормальным кодом возврата завершается - и тут же все данные на диск
>ну и серьезно
>3. как подавить кеширование для конкретного процесса ?А хрен его знает. Вобщем-то вопрос решен - пора тред закрывать (а про кеширование, если интересно, новый заводить).
Удачи!
>>2. а че ж тогда
>>cat /dev/ttyd0 > outfile - ну совсем не кешируется ??? :)
>>
>
>кешируется, только cat с нормальным кодом возврата завершается - и тут же
>все данные на диск
>Тут я не прав. Но влюбом случае я лишь высказал мысль и, по моему, она помогла решить проблему - детальные разборки уже ни к чему - тред действительно пора закрывать.
Еще раз - удачи!
>>>2. а че ж тогда
>>>cat /dev/ttyd0 > outfile - ну совсем не кешируется ??? :)
>>>
>>
>>кешируется, только cat с нормальным кодом возврата завершается - и тут >>же все данные на диск
>>да нет, всегда когда я сравниал с CAT , то имелось ввиду
cat /dev/ttyd0 > outfile &
итого: процесс в фоне (какой уж тут завершен), а outfile пишется построчно сразу без всяких кешей.
равно как если не опускать в фон, но файл смотреть другим теминалом.
удачи!
>>>>2. а че ж тогда
>>>>cat /dev/ttyd0 > outfile - ну совсем не кешируется ??? :)
>>>>
>>>
>>>кешируется, только cat с нормальным кодом возврата завершается - и тут >>же все данные на диск
>>>
>
>да нет, всегда когда я сравниал с CAT , то имелось ввиду
>
>
>cat /dev/ttyd0 > outfile &
>
>итого: процесс в фоне (какой уж тут завершен), а outfile пишется построчно
>сразу без всяких кешей.
>равно как если не опускать в фон, но файл смотреть другим теминалом.
>
>
>
>удачи!Мой e-mail в форуме виден, есть желание пиши - продолжим разговор.