Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc (stdin perl select grep head)

Модератор: Модераторы разделов

Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

Сообщение korisk »

Добрый вечер.

Например grep:

I. cmd|grep word
или
II. cmd > ./file.out; grep word ./file.out
Обе команды работют одинаково, независимо от времени выполнения cmd.


Перловый скрипт
grep.pl:

@str = <STDIN>;
print make_grep(@str);

Не завершится, пока на в ходе не появиться EOF, т.е. вариант II не сработает.

Если использовать select, то скрипт получается зависимым от времени выполнения cmd.

...
select($stdin,0...,$time);
...
если $time меньше времени выполнения cmd, то grep.pl ничего не получает, а большим $time делать невыгодно.


Может кто-нибудь подскажет как сделать grep.pl похожим на grep!?
Или я что-то жутко путаю?

Спасибо.
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

Сообщение Portnov »

Надо написать что-то вроде такого

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

while (<>)
{
  chomp;
  if (....) ....
}

Оператор "<>" читает строку из файла, указанного в командной строке, или со стандартного входа, если ком.строка пустая.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

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

люблю я однострочники...

$ echo -e 'words\nlines'|perl -ne 'print if /word/' words $ echo -e 'words\nlines'|perl -ne 'print if /line/' lines $ echo -e 'words\nlines' >/tmp/0;perl -ne 'print if /word/' /tmp/0 words $ echo -e 'words\nlines' >/tmp/0;perl -ne 'print if /line/' /tmp/0 lines
или я тоже что-то жутко путаю?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

Сообщение korisk »

Три варианта:

[korisk@korsik tmp]$ cat sqt.s |grep esp
blah blah blah esp
,
[korisk@korsik tmp]$ grep esp ./sqt.s
blah blah blah esp
и(!)
[korisk@korsik tmp]$ grep
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

Хочется чтобы скрипт(не обязательно поиска слова) вызваный из командной строки мог что-то сообщить.
grep - только пример.
пытался использовать select - работает, но не всегда.(см выше)
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

Сообщение korisk »

Пример:

[korisk@korsik tmp]$ cat /tmp/tmp.pl

Код:

#!/usr/bin/perl my $pattern = shift @ARGV; while (<>) { #можно добавить comp, но не поможет. print $_ if /$pattern/; }


[korisk@korsik tmp]$ cat sqt.s |/tmp/tmp.pl esp
blah blah blah esp

[korisk@korsik tmp]$ /tmp/tmp.pl esp sqt.s
blah blah blah esp
но(!)

[korisk@korsik tmp]$ /tmp/tmp.pl
"висяк"(ожидание ввода)


Код:

#!/usr/bin/perl my $pattern = shift @ARGV; vec($rin,fileno(STDIN),1) = 1; $nfound = select($rin, undef, undef, 0.2); if($nfound > 0){ while (<>) { print $_ if /$pattern/; } }else{ $file = shift; if(defined($file)){ print "find word in $file\n"; }else{ print "some help\n"; } }


Этот работает лучше,


[korisk@korsik tmp]$ /tmp/tmp.pl esp sqt.s
find word in sqt.s
,
[korisk@korsik tmp]$ /tmp/tmp.pl
some help
, но(!)
[korisk@korsik tmp]$ for i in `seq 1 3`;do sleep 1;echo "hello, esp blah";done |/tmp/tmp.pl
some help

скрипт ждет 0.2 сек и выходит
grep отрабатывает нормально:
[korisk@korsik tmp]$ for i in `seq 1 3`;do sleep 1;echo "hello, esp blah";done |grep esp
hello, esp blah
hello, esp blah
hello, esp blah

как написать perl-скрипт похожий на grep?
спасибо
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

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

обойти ожидание можно примерно так

$ echo words > /tmp/0 $ perl -e 'exit if(-t STDIN&@ARGV==0);while(<>){print"1$_"}' /tmp/0 1words $ echo words|perl -e 'exit if(-t STDIN&@ARGV==0);while(<>){print"1$_"}' 1words $ perl -e 'exit if(-t STDIN&@ARGV==0);while(<>){print"1$_"}' $
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc

Сообщение korisk »

Да! это то что нужно.
Не знал что такие операторы быват (-t etc)
Огромное спасибо!
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали: