Sim! perl
significa Linguagem de pesquisa e extração prática .
Em vez de usar as sintaxes shell
, como:
tail -f file | grep --line-buffered someting
ou
tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'
(Nota: --line-buffered
in grep
, como -u
in sed
são úteis para evitar buffering por blocos de tamanho fixo )
Para ver / navegar por registros, perl
é o idioma .
Dependendo do que você está esperando ... você pode ter que criar um pequeno script para corresponder exatamente à sua necessidade.
Você pode encontrar algumas amostras úteis no perlfaq, como em perldoc perlfaq5
(ou man perlfaq5
se você não instalou perldoc
), há uma pergunta: Como faço um " tail -f "in perl? onde eu tirei isto:
First try
seek(GWFILE, 0, 1);
The statement
seek(GWFILE, 0, 1)
doesn't change the current position, but it does clear the end-of-file condition on the handle, so that the next<GWFILE>
makes Perl try again to read something.If that doesn't work (it relies on features of your stdio implementation), then you need something more like this:
for (;;) { for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) { # search for some stuff and put it into files } # sleep for a while seek(GWFILE, $curpos, 0); # seek to where we had been }
Já usei isso várias vezes para acionar casos especiais.
DEMO
Por exemplo, há um contador de log quick and dirty
em tempo real em teste! (precisa de acesso de leitura a /var/log/syslog
;-):
#!/usr/bin/perl -w
my %counter;
open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );
for ( ; ; ) {
for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
$counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
}
syswrite STDOUT, sprintf "\r%s\e[K",
join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
select undef,undef,undef,1;
seek( FH, $curpos, 0 );
}
Produzia uma linha, auto-reflorante a cada segundo, contendo todo o nome do daemon e um contador para cada um deles:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1