Linux Preview

Hace 4 años

Las mejores herramientas y técnicas para la búsqueda de datos en los sistemas Unix

find-data


A veces, buscar información en un sistema Unix es como buscar agujas en un pajar. Incluso los mensajes importantes pueden ser difíciles de notar cuando están enterrados en enormes pilas de texto. Y así muchos de nosotros estamos tratando con «grandes datos» en estos días los archivos de registro que son varios gigabytes de tamaño y enorme récord de colecciones en cualquier forma que pueda ser extraído para la inteligencia de negocios.

Afortunadamente, sólo hay dos momentos en los que necesita excavar a través de montones de datos para hacer su trabajo cuando sabes lo que estás buscando y cuando no. 😉 Las mejores herramientas y técnicas dependerán de cuál de estas dos situaciones se está enfrentando.

Cuando lo haces

Cuando usted sabe lo que está buscando, grep es tu amigo. Y no sólo cuando estás buscando un texto específico. El comando grep puede ayudarle a encontrar un texto arbitrario, palabras específicas, patrones de texto, y el texto con el contexto. La Búsqueda de texto cuando se sabe exactamente lo que parece que es generalmente fácil. El comando grep comando se mostrará cada línea en un archivo llamado «eso» que contiene la cadena «esto». Añadir la opción -w sólo mostrará aquellas líneas a usted cuando contengan «esto» como una palabra separada. En otras palabras, no le mostrará las líneas que contienen «thistle» o «erethism» a menos que esas líneas también contengan la palabra «esto».El comando grep más directo tiene poco poder cerebral de digerir:

$ grep find poem
finding meaning, finding comfort,
finding someone to adore
Can we find a way 

Encontrar palabras completas se puede hacer mediante la adición de la opción -w:

$ grep -w find poem
Can we find a way to be

Encontrar patrones se pone un poco más complicado. Nuestro primer ejemplo nos 
permite mostrar las líneas con la palabra "find" si empieza con una 
minúscula o una "F" mayúscula:

$ grep [Ff]ind poem
Finding answers
finding meaning, finding comfort,
finding someone to adore
Can we find a way to be

 

Si usted desea hacer coincidir en el texto sólo en los inicios o final de las líneas, se puede anclar sus coincidencias usando ^ (comienzo) o $ (final).
$ grep ^find poem
finding meaning, finding comfort,
finding someone to adore

Si usted quiere encontrar líneas que contienen palabras con dos vocales consecutivas,
 puede utilizar el carácter "AEIOUaeiou" para establecer como se muestra a 
continuación.
$ grep -E "[AEIOUaeiou]{2}" poem | head -3
All our days are filled with searching
wondering what we're looking for
finding meaning, finding comfort,


la búsqueda de cadenas con 9-10 letras:

$ grep -E "[[:alpha:]]{9,10}" poem
All our days are filled with searching
wondering what we're looking for
All our days are filled with searching
that makes the searching more productive


Encontrar la palabra "find" cuando es parte de una palabra más larga:

$ ann> grep -E "find[^[:space:]]+" poem
finding meaning, finding comfort,
finding someone to adore


La mayoría de nosotros no estamos buscando a través de la poesía, por supuesto, 
pero estas mismas técnicas se pueden utilizar para extraer información relevante 
de nuestros archivos de sistema. En el siguiente ejemplo, estamos buscando en el 
término "processor" y se presentan nuestros hallazgos en cinco grupos de líneas 
(dos líneas antes y después de dos líneas) para proporcionar un poco de contexto. 
Cambie -C 2 a -C 4 y obtendrá 9 grupos de línea en su lugar.

$ grep -C 2 processor /var/log/dmesg
Using ACPI (MADT) for SMP configuration information
Allocating PCI resources starting at 88000000 (gap: 80000000:7ec00000)
Detected 3400.426 MHz processor.
Built 1 zonelists.  Total pages: 524275
Kernel command line: ro root=LABEL=/1
--
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 2071140k/2097100k available (2223k kernel code, 24616k reserved, 922k data, 232k init, 1179596k highmem)
Checking if this processor honours the WP bit even in supervisor mode... Ok.
Calibrating delay loop (skipped), value calculated using timer frequency.. 6800.85 BogoMIPS (lpj=3400426)
Security Framework v1.0.0 initialized
--
CPU0: Intel(R) Xeon(TM) CPU 3.40GHz stepping 04
SMP alternatives: switching to SMP code
Booting processor 1/1 eip 11000
CPU 1 irqstacks, hard=c0779000 soft=c0759000
Initializing CPU#1
--
CPU1: Intel(R) Xeon(TM) CPU 3.40GHz stepping 04
SMP alternatives: switching to SMP code
Booting processor 2/6 eip 11000
CPU 2 irqstacks, hard=c077a000 soft=c075a000
Initializing CPU#2
--
CPU2: Intel(R) Xeon(TM) CPU 3.40GHz stepping 04
SMP alternatives: switching to SMP code
Booting processor 3/7 eip 11000
CPU 3 irqstacks, hard=c077b000 soft=c075b000
Initializing CPU#3


Cuando no lo hace

Si lo que buscas es el texto que va a encontrar en un lugar conocido, como cuando 
Perl le dice que su guión se topó con problemas en la línea 73 de la secuencia de 
comandos o línea 1892 en el archivo que está procesando con él, puedes usar sed 
para mostrar las líneas particulares (odio contar hasta 1892!). Y, con un poco de 
esfuerzo extra, puede mostrar sólo esa línea.

El error podría tener este aspecto:

“syntax error line 73 near ”} else“ ”


Puede utilizar un comando sed para mostrar la línea en cuestión:

$ sed -n 73p showvars
else


OK, esa es la línea, pero no sabemos mucho más de lo que sabíamos antes. Añadir un 
poco de contexto, mostrando algunas de las líneas que proceden y podríamos 
simplemente detectar el error. Aquí hay un comando similar que muestra una la línea 
más los diez líneas anteriores:

sed -n 63,73p showvars
if $password eq "a_secret";
{
    foreach $var (sort(keys(%ENV))) {
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
        print '${var}=\"${val}\"\n'
    };
}
else

¡Huy! Parece que alguien está teniendo problemas para escribir si cláusulas! Y 
tenemos una solución obvia para hacer.

También puede utilizar un comando sed para resaltar las líneas que tienen algún 
contenido particular. En el comando se muestra a continuación, se añade una 
"flecha" para resaltar cada línea que contiene el comando foreach:

$ sed '/foreach/{b label1; {:label1 ; s/$/ <===/ ;} }' showvars
#!/bin/bash

if $password eq "a_secret";
{
    foreach $var (sort(keys(%ENV))) { <===
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
        print '${var}=\"${val}\"\n'
    };
}
else


Usted podría utilizar un comando similar al comentar sus comandos de impresión:

$ sed '/print/{b label1; {:label1 ; s/^/# / ; s/$/ <===/ ;} }' showvars
#!/bin/bash

if $password eq "a_secret";
{
    foreach $var (sort(keys(%ENV))) {
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
#         print '${var}=\"${val}\"\n' <===
    };
}
else


Agujas en pajares son difíciles de encontrar. De hecho, las agujas en la alfombra 
son difíciles de encontrar. Pero variaciones sobre algunos de los comandos de Unix 
más utilizados pueden hacer lo que usted está buscando más fácil - incluso cuando 
no estás seguro de lo que podría ser.

Fuente: itworld.com
 
 
 
 
 
 





Comentar con Facebook