URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 22121
[ Назад ]

Исходное сообщение
"HELP! Непонятки с перенаправлением GREPа  ?!! "

Отправлено Antony , 21-Окт-02 17:29 
Привет!
grep < /dev/ttyd0   - работает как надо
cat /dev/ttyd0 > out.file   - аналогично

но
grep < /dev/ttyd0 > out.file    -  НЕ РАБОТАЕТ !!!
часа два я ужо и так и этак ... - не дается :(

В ЧЕМ ГРАБЛИ ??!

p.s.
grep < in.file > out.file   - работает :(  :)


Содержание

Сообщения в этом обсуждении
"Очепятка, везде естественно grep PATTERN ..."
Отправлено Antony , 21-Окт-02 17:35 
>Привет!
.

"RE: HELP! Непонятки с перенаправлением GREPа  ?!! "
Отправлено LS , 22-Окт-02 19:40 
>grep < in.file > out.file   - работает :(  :)

Похоже дело в том, что тут ты ^C не давишь - код возврата из grep нормальный...

Так не подойдет?

while read text; do echo "$text" | grep PATTERN >> OUTFILE ; done

или что ты сделать хотел?


"RE: HELP! Непонятки с перенаправлением GREPа  ?!! "
Отправлено Antony , 23-Окт-02 11:43 
>>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 - реально фильтрует и на терминал выводит,
а вот в файл, что удивительно, не пишет (перенаправлением) :(


"RE: HELP! Непонятки с перенаправлением GREPа  ?!! "
Отправлено LS , 23-Окт-02 13:28 
>>>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
qq

давим ^D

exit code - 0
[syslha@main test]$ ls
outfile
[syslha@main test]$ cat outfile
blablabla
aaaaaaaaaaaaaaaaaaaaaa-aaaaaaaaaaaaa-aaaaaaaaaaa
[syslha@main test]$


"ttyd0  vs  ttyp0"
Отправлено Antony , 23-Окт-02 15:03 
/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


"RE: ttyd0  vs  ttyp0"
Отправлено LS , 23-Окт-02 16:29 

>для примера:
>/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



"RE: ttyd0  vs  ttyp0"
Отправлено LS , 23-Окт-02 16:31 
>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


"хрена лысого, никак не работает :("
Отправлено Antony , 23-Окт-02 17:00 
>
>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

по-прежнему прокатывает легко (на экран).

мистика или ... на этом мысль заканчивается :)


"RE: хрена лысого, никак не работает :("
Отправлено LS , 23-Окт-02 17:29 
>>
>>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)


"RE: хрена лысого, никак не работает :("
Отправлено Antony , 23-Окт-02 17:55 
>
>а ты точно >> OUTFILE написал, а не > OUTFILE ? Иначе у тебя при обработке каждой строки старые данные будут затираться. В результате получишь файл нулевой длины (если последняя строка под PATTERN не попадет) или файл с всего одной строкой.

не готов согласиться, почему это будет затираться ??
но вдаваться дальше пока не буду :)

>
>Почаса ждать не обязательно - как только данные попадают на /dev/ttyd0 они
>должны переноситься в файл тут же (поставь для теста PATTERN попроще
>и следи за изменением размера OUTFILE)

да, именно >> ставил !
запускал и с другого терминала заходил смотрел,
и в фон отправлял

глядел - OUTFILE расти НЕ ХОЧЕТ !!

от cat - растет посекундно, от grep - ну ни как !


"RE: хрена лысого, никак не работает :("
Отправлено Antony , 23-Окт-02 18:02 
добавлю кстати

grep a < /dev/ttyp0 >> outfile
и на клавиатуре
baba
bubu
dfdf
caca
и т.д.

останавливаюсь захожу с другого терминала:
файл - НУЛЕВЫЙ !

^D - на первом терминале
смотрю со второго - ВСЕ В ПОРЯДКЕ , отгреплено и записано!

получается, что grep и со stdin в файл построчно писать не хочет !
вот :(


"RE: хрена лысого, никак не работает :("
Отправлено LS , 23-Окт-02 18:31 
>добавлю кстати
>
>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

У меня к сожалению с порта читать нечего, но при чтении с консоли все работает нормально (а как кстати у тебя?) - так, что окончательная проверка опять за тобой :)


"RE: хрена лысого, никак не работает :("
Отправлено LS , 23-Окт-02 18:39 
приведи кстати примерчик чего тебе cat /dev/ttyd0 на консоль выдает - может просто под твою PATTERN ничего не попадает...

"RE: хрена лысого, никак не работает :("
Отправлено LS , 23-Окт-02 18:49 
>>
>>а ты точно >> OUTFILE написал, а не > OUTFILE ? Иначе у тебя при обработке каждой строки старые данные будут затираться. В результате получишь файл нулевой длины (если последняя строка под PATTERN не попадет) или файл с всего одной строкой.
>
>не готов согласиться, почему это будет затираться ??
>но вдаваться дальше пока не буду :)
>

потому что > создает файл (или усекает существующий), а после этого записывает данные. так что при обработке второй строки внутри цикла, результаты обработки первой будут уничтожены (если они к тому времени были в файле). а >> будет дописывать информацию в конец файла и позволит этого избежать.


"RE: хрена лысого, заработает :("
Отправлено Antony , 24-Окт-02 11:25 
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 не верны и проблемка с другой стороны от терминала? :)
может я сразу не в ту сторону побрел?
может тут не грепом надо??? (фильтровать строки и СРАЗУ писать в файл)
тогда чем ?

Еще раз СПАСИБО! Бум делать!


"RE: хрена лысого, заработает :("
Отправлено LS , 24-Окт-02 11:52 
>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 не верны и проблемка с другой
>стороны от терминала? :)
>может я сразу не в ту сторону побрел?
>может тут не грепом надо??? (фильтровать строки и СРАЗУ писать в файл)
>

Может быть, но мне уже просто интересно именно греп победить (видать я тоже один из тех, кого война не поубивала :)

>тогда чем ?
>
>Еще раз СПАСИБО! Бум делать!

Отпиши что получилось


"RE: хрена лысого, заработало :("
Отправлено Antony , 24-Окт-02 12:34 
ссори если нечетко написал :)

( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE

РАБОТАЕТ !!!
т.е. опускаю ету жуть :) в фон и смотрю: файл постоянно прирастает правильными отфильтрованными строками  - ОК!

>Ну не такая уж она и жуткая :)
жуткая конечно только в смысле соответствия ОЧЕНЬ ПРОСТОЙ решаемой задачи

собственно ЗАДЕЛ внезапный стопор по простому вопросу,
и казалось даже не по грепу :
< /dev/ttyd0 - это шелловская фитча, ну да, формат потока должен поедаться грепом, тут в принципе могут быть(?) непонятки и нестыковки,
и естественно работает!

НО !!! :
> outfile - это только шелл !!!!!!!
если уж греп сьел поток и может выкидывать построчно данные на терминал (stdout!),
ТО ПОЧЕМУ ШЕЛЛ НЕ МОЖЕТ ЗАВЕРНУТЬ ВЫВВОД В ФАЙЛ ВМЕСТО SDTOUT????? ТУТ УЖЕ ГРЕП НИ ПРИ ПИ#$@Е. ну совсем ни при чем вроде :о) , он уже отработал.
а раз не может, значит это МОЕ непонимание процесса (простого??? перенаправления вывода), повторюсь вот это и задело.

а так что, вопрос пустяшный :)
в стране вон, что творится :(


"ничего личного, без обид"
Отправлено Antony , 24-Окт-02 12:59 
и еще "пару слов без протокола"

досадно, что мало кого задел вопрос
ну ни нашел я никаких особенностей про греп в man grep

а ведь вопрос вроде простой и по элементарной теме - перенапраление вывода.
про это пишут в разных книгах на первых страницах.

шо - никто не знает, почему все это так? ( МЭТРЫ, АУ! )

или считют что "это элементарно" и пусть два дурака стебаются

%SUBJ


"RE: хрена лысого, заработало :("
Отправлено LS , 24-Окт-02 13:05 
>ссори если нечетко написал :)
>
>( cat /dev/ttyd0 | while read text ; do echo "$text" | greg PATTERN ; done ) > OUTFILE
>
>РАБОТАЕТ !!!
>т.е. опускаю ету жуть :) в фон и смотрю: файл постоянно прирастает
>правильными отфильтрованными строками  - ОК!
>

Ну слава богу !!!

>>Ну не такая уж она и жуткая :)
>жуткая конечно только в смысле соответствия ОЧЕНЬ ПРОСТОЙ решаемой задачи
>
>собственно ЗАДЕЛ внезапный стопор по простому вопросу,
>и казалось даже не по грепу :
>< /dev/ttyd0 - это шелловская фитча, ну да, формат потока должен поедаться
>грепом, тут в принципе могут быть(?) непонятки и нестыковки,
>и естественно работает!
>
>НО !!! :
>> outfile - это только шелл !!!!!!!
>если уж греп сьел поток и может выкидывать построчно данные на терминал
>(stdout!),
>ТО ПОЧЕМУ ШЕЛЛ НЕ МОЖЕТ ЗАВЕРНУТЬ ВЫВВОД В ФАЙЛ ВМЕСТО SDTOUT????? ТУТ
>УЖЕ ГРЕП НИ ПРИ ПИ#$@Е. ну совсем ни при чем вроде
>:о) , он уже отработал.
>а раз не может, значит это МОЕ непонимание процесса (простого??? перенаправления вывода),
>повторюсь вот это и задело.
>

Опять повторяюсь, но видимо так туманно об'яснял - отработать-то он отработал, но вот нормально завершился или нет? Когда ты посылаешь данные на консоль, то система отображает их тутже, а при записи в файл - 100% кеширует. Поэтому когда греп завершается с кодом ошибки, система просто не записывает данные на диск - и правильно делает.

А поскольку ^D  у тебя не срабатывал (т.е. нормально утихомирить греп не удавалось) я и предложил обрабатывать данные маленькими порциями (ввел цикл), чтобы при обработке такой порции греп всегда завершался нормально (и как результат данные записывались на диск).

Так что собственно само переопределение выходного потока здесь не причем, тут ты все правильно понимал и делал. Система честно перенаправляет вывод туда, куда ты ей указал (см. опять же п.4) - ключевой момент в том, что работает она с консолью и файлами ПО РАЗНОМУ.

>а так что, вопрос пустяшный :)

Вопрос самое то - на таких мелочах и надо разбираться

>в стране вон, что творится :(

И не говори... :))))))



"ну давай про кеширование .... гыы"
Отправлено Antony , 24-Окт-02 13:18 
про кеширование:
1. было ужо ;)
гыы
я писал, что ждал пол часа, а ты мне в ответ, что нефиг ждать :))
ладно седня
grep < /dev/ttyd0 >> outfile    на сутки в фон оставлю
=> только завтра сообщю:)

2. а че ж тогда
cat /dev/ttyd0 > outfile   - ну совсем не кешируется ???   :)

ну и серьезно
3. как подавить кеширование для конкретного процесса ?


"RE: ну давай про кеширование .... гыы"
Отправлено LS , 24-Окт-02 13:39 
>про кеширование:
>1. было ужо ;)
>гыы
>я писал, что ждал пол часа, а ты мне в ответ, что
>нефиг ждать :))

я писал про конструкцию с циклом, а там действительно ждать нефиг

>ладно седня
>grep < /dev/ttyd0 >> outfile    на сутки в фон оставлю
>=> только завтра сообщю:)

думаю так долго ждать нет необходимости - попробуй через полчасика sync дать, а вообще - это уже фигней заниматься

>
>2. а че ж тогда
>cat /dev/ttyd0 > outfile   - ну совсем не кешируется ???   :)
>

кешируется, только cat с нормальным кодом возврата завершается - и тут же все данные на диск

>ну и серьезно
>3. как подавить кеширование для конкретного процесса ?

А хрен его знает. Вобщем-то вопрос решен - пора тред закрывать (а про кеширование, если интересно, новый заводить).

Удачи!


"RE: ну давай про кеширование .... гыы"
Отправлено LS , 24-Окт-02 13:47 
>>2. а че ж тогда
>>cat /dev/ttyd0 > outfile   - ну совсем не кешируется ???   :)
>>
>
>кешируется, только cat с нормальным кодом возврата завершается - и тут же
>все данные на диск
>

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

Еще раз - удачи!


"на посошок :)"
Отправлено Antony , 24-Окт-02 14:08 
>>>2. а че ж тогда
>>>cat /dev/ttyd0 > outfile   - ну совсем не кешируется ???   :)
>>>
>>
>>кешируется, только cat с нормальным кодом возврата завершается - и тут >>же все данные на диск
>>

да нет, всегда когда я сравниал с CAT , то имелось ввиду

cat /dev/ttyd0 > outfile &

итого: процесс в фоне (какой уж тут завершен), а outfile пишется построчно сразу без всяких кешей.
равно как если не опускать в фон, но файл смотреть другим теминалом.


удачи!


"RE: на посошок :)"
Отправлено LS , 24-Окт-02 20:30 
>>>>2. а че ж тогда
>>>>cat /dev/ttyd0 > outfile   - ну совсем не кешируется ???   :)
>>>>
>>>
>>>кешируется, только cat с нормальным кодом возврата завершается - и тут >>же все данные на диск
>>>
>
>да нет, всегда когда я сравниал с CAT , то имелось ввиду
>
>
>cat /dev/ttyd0 > outfile &
>
>итого: процесс в фоне (какой уж тут завершен), а outfile пишется построчно
>сразу без всяких кешей.
>равно как если не опускать в фон, но файл смотреть другим теминалом.
>
>
>
>удачи!

Мой e-mail в форуме виден, есть желание пиши  - продолжим разговор.