Добрый вечер.
Например 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!?
Или я что-то жутко путаю?
Спасибо.
Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc (stdin perl select grep head)
Модератор: Модераторы разделов
-
korisk
- Сообщения: 205
- ОС: Xubuntu
Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc
Registerd Linux user #486684 at http://counter.li.org/
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc
Надо написать что-то вроде такого
Оператор "<>" читает строку из файла, указанного в командной строке, или со стандартного входа, если ком.строка пустая.
Код: Выделить всё
while (<>)
{
chomp;
if (....) ....
}Оператор "<>" читает строку из файла, указанного в командной строке, или со стандартного входа, если ком.строка пустая.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Как создать pl скрипт, работающий со стандартным IO как grep, head, tail etc
люблю я однострочники...
$ 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@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 - работает, но не всегда.(см выше)
[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@korsik tmp]$ cat /tmp/tmp.pl
[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
"висяк"(ожидание ввода)
Этот работает лучше,
[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?
спасибо
[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
обойти ожидание можно примерно так
$ 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
Да! это то что нужно.
Не знал что такие операторы быват (-t etc)
Огромное спасибо!
Не знал что такие операторы быват (-t etc)
Огромное спасибо!
Registerd Linux user #486684 at http://counter.li.org/