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
^ 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/greppY 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 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)
(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.