jueves, 22 de noviembre de 2012

Comando grep Perl desde Unix

Hace poco vimos el manejo de archivos en perl  y también el uso de $ARGV así que ya estamos listos para ver el manejo de grep en perl,como se habrán dado cuenta grep es un comando que se encuentra en sistemas tipo Unix para filtrado de texto,este comando también se encuentra en el lenguaje de programación Perl

La sintaxis que se usa en Unix es esta

grep palabra archivo

O con un pipe

comando | grep palabra

Etc

En el scripting perl se define el algoritmo de esta manera:


 @palabras = ('Linux', 'iOS', 'iPhone', Darwin', 'Android', 'FreeBSD');
 @grepPalabras = grep(/^i/, @palabras);

 Esto lo que hace es filtrar el array palabras con la letra i

 grep(/^i/, @palabras);

Lo que valla adentro de:

/^aquí/

Es la letra o palabra que se filtra

Veamos el ejemplo ejecutado

#!/usr/bin/env perl


use strict;
use warnings;
use utf8;

my @palabras = ('Linux', 'iOS', 'iPhone', 'Darwin', 'Android', 'FreeBSD');
my @grepPalabras = grep(/^i/, @palabras);
print "@grepPalabras\n";


Como podemos ver se filtro lo que iniciara con i




Pero vamos a explicarlo


my @palabras = ('Linux', 'iOS', 'iPhone', 'Darwin', 'Android', 'FreeBSD');

^ Esto es un array que contiene las palabras,puede ser definido también así:

my @palabras = qw(Linux iOS iPhone Darwin Android FreeBSD);

O puede ser un archivo(mas adelante lo veremos)

my @grepPalabras = grep(/^i/, @palabras);

^ Es un array al que le pasamos el comando grep

grep(/^i/, @palabras);

^ En el segundo argumento (@palabras) tiene que ser el array que comente antes

print "@grepPalabras\n";

^ Llamamos el array que ya filtro el otro

Como vieron y he recalcado se imprimió lo que comenzara con i,ahora hay una forma de que sea viceversa que se imprima lo que no inicie con i

Solo basta con añadir un !

Al principio de la sintaxis de grep:

grep(!/^i/, @palabras);

Por ejemplo:

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

my @palabras = qw(Linux iOS iPhone Darwin Android FreeBSD);
my @grepPalabras = grep(!/^i/, @palabras);
print "@grepPalabras\n";




Vamos a hacer algo como lo que hicimos en la entrada pasada,un ejemplo de como funciona grep de Unix con un algoritmo en perl

#!/usr/bin/env perl

if($ARGV[0] and $ARGV[1]) {
grp($ARGV[0],$ARGV[1]);
}else{
        print "\n[+] Sintax : $0 <Palabra> <Archivo>\n";
}

sub grp {

my($palabra,$archivo) = @_ ;

open (FILE,"$archivo") || die "$!\n";

while (<FILE>) {  

chomp;

my @palabra = grep{/^$palabra/} <FILE>; 

print "@palabra";
                        }
}

Este algoritmo es simple ya que en este caso lo que hace es,abrir un archivo y filtrar una palabra.

Pero podemos ver un poco mas del poder de grep

En mi caso vamos a hacer lo que hicimos en la entrada pasada

Creamos un archivo.pl

Que contenga lo siguiente


#!/usr/bin/env perl

if($ARGV[0] and $ARGV[1]) {
grp($ARGV[0],$ARGV[1]);
}else{
        print "\n[+] Sintax : $0 <Palabra> <Archivo>\n";
}

sub grp {

my($palabra,$archivo) = @_ ;

open (FILE,"$archivo") || die "$!\n";

while (<FILE>) {  

chomp;

my @palabra = grep{/^$palabra/} <FILE>; 

print "@palabra";
                        }
}

Lo movemos a /usr/bin,yo le puse grepp,pero le pueden poner el nombre que gusten

sudo mv archivo.pl /usr/bin/grepp
Y le damos permisos de ejecución

sudo chmod +x /usr/bin/grepp
Ahora ejecutamos en la terminal con esta sintaxis

grepp palabra archivo



Como se puede ver este comando no tiene el mismo poder que grep :(

Porque?

En primera algoritmo del script es muy básico y solo hace lo que dice abrir un archivo y filtrar el contenido

En segunda se pueden dar cuenta que no es lo mismo hacer(no da los mismos resultados)

grep archivo.txt

que

grepp archivo.txt

Porque?

Porque este símbolo ^ indica que solo filtre la palabra si contiene la letra en el principio

Como veíamos

En este ejemplo


#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

my @palabras = ('Linux', 'iOS', 'iPhone', 'Darwin', 'Android', 'FreeBSD');
my @grepPalabras = grep(/^i/, @palabras);
print "@grepPalabras\n";


Solo se filtraba iOS y iPhone y grep de Unix hubiera filtrado también

Android Darwin Linux




Al contener una i aunque no sea al principio.

Y esto se puede hacer con perl?

Si, solo quitamos este símbolo ^


#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

my @palabras = ('Linux', 'iOS', 'iPhone', 'Darwin', 'Android', 'FreeBSD');
my @grepPalabras = grep(/i/, @palabras);
print "@grepPalabras\n";

Y esto nos dará un resultado igual que con grep de Unix

(Que filtre todas las palabras que tengan la letra,aunque no sea al principio)


Por ejemplo editen grepp

sudo vim /usr/bin/grepp

Y borran 


^

De la sintaxis de grep


my @palabra = grep{/^$palabra/} <FILE>; 

Pueden verlo en este ejemplo



Eso es todo

Bueno no,no es todo ya que hay muchas cosas,por ejemplo se puede definir grep de otra manera

Aquí la documentación oficial

http://perldoc.perl.org/functions/grep.html

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.