Mostrando las entradas con la etiqueta grep. Mostrar todas las entradas
Mostrando las entradas con la etiqueta grep. Mostrar todas las entradas

sábado, 30 de marzo de 2013

Matar procesos por nombre en Terminal Linux


Como mostré en una entrada pasada,que ya tiene tiempo,vimos como matar procesos pero por PID(identificador de proceso),pues esta vez lo haremos por nombre,ya que es un poco mas facil usar el nombre del programa,proceso que algo como 134747.

Tutorial

Primero que nada debemos saber el nombre exacto de nuestro programa, aplicaron o proceso abierto,para eso vamos a usar un poco de regex en grep,pero como soy perlero y los ando induciendo a perlear vamos a usar:

pcregrep

El grep compatible con las expresiones de Perl :D

Bien primero de damos color para que se vea como grep al encontrar coincidencias,con este comando:

echo 'alias pcregrep="pcregrep --color"' >> ~/.bashrc && source ~/.bashrc

Bien ahora podemos hacer esto:

Imaginemos que se nos traba un programa(si, se nos traba en Linux) en Ubuntu :P y sabemos como se llama,pero mas o menos porque el nombre comercial no es el mismo que usa Unix para el proceso,asi que imaginemos que se llama Firefox,para encontrarlo,usamos una expresion que busque desde Fire hacia adelante y que no le importe minusculas o mayusculas:

ps -e | pcregrep -Mi "Fire(.*)"

Explico:

ps -e # Muestra todos los procesos con poca informacion(pero es la que nos interesa)

pcregrep # Es grep con Perl

-Mi # Aqui hay dos parámetros M que indica que busque en multilinea y i que es ignore case,osea que no le importe mayúsculas o minusculas

"Fire(.*)" # Es lo que queremos buscar,pero con esta expresión (.*) que indica lo que siga hacia adelante,seria como Fire* en Unix Wildcards



Como puden ver me salio que se llama firefox no Firefox,asi que tenemos que usar el nombre que salio en rojo

Ahora solo usamos este comando

killall firefox
O si tenemos ekill

ekill firefox
Así de fácil :D

Nota: Si tenemos varias ventanas abiertas de firefox o de otro programa,nos cierra todas!!! 

Ahora si no nos gusta eso de andar usando la terminal pueden instalar xkill:

sudo emerge xkill

sudo apt-get install xkill

sudo pacman -S xorg-xkill

Lo lanzamos,como dije en esta entrada no se necesita lanzarlo desde la terminal,podemos usar combinaciones de teclas o el ejecutor de nuestro entorno,LXDE tiene uno en el menú KDE tiene uno arriba del escritorio,hasta windows tiene uno :P,o desde Terminal :S:

xkill
Nos sale una calaca y "cierra" las ventanas que cliquemos,pero cuidado porque "no tiene misericordia",si cliqueamos el escritorio por ejemplo hasta le hace kill a el proceso que pone el wallpaper,es una herramienta indispensable (en mi opinión)  ya que aveces se cuelga el sistema(mas que nada ubuntu) y este programa cierra las ventanas o procesos fácilmente,pero como dije en la otra entrada si ya ni semueve no prodra lanzar el proceso y es donde entra en acción kill o killall desde una tty :D

Eso es todo

Leer más...

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

Leer más...